長年の潜伏者、最近の新人。
LINQ-to-Entities を使用したクエリで少し苦労しています。Web および Entity Framework 4.0 用に Visual Studio Express 2012 を使用しています。私がすべてをカバーしていることを確認するために、それは長い説明です。状況は次のとおりです。
イメージ マネージャーとして機能する再利用可能な .aspx ページがあります。Ajax Toolkit FileUpload コントロールと、アップロードされたファイルを表示するための Repeater があります。Fancybox Modal Pop-up (iframe) 内でこの Manager にアクセスします。URLを開くには、「ID」と「タイプ」の2つのパラメーターがあります。
私の ImageManager コード ビハインド ファイルには、すべての画像をリピーターにバインドする関数があります。この関数では、"Type" (url パラメーター) に従ってデータベース テーブルをクエリする必要があります。まさにそこに問題があります。
私の人生では、テーブル名が変更され、タイプに応じて変更される動的な LINQ-to-Entities クエリを作成する方法がわかりません...
関数は次のとおりです(問題のある部分にはコメントがあります):
private void BindImagesRepeater()
{
DatabaseEntities db = new DatabaseEntities();
FolderName = Session["foldername"].ToString();
FolderPath = Server.MapPath("~") + "controls/" + FolderName + "/images";
int itemid = Convert.ToInt32(Session["itemID"]);
bool dirExist = Directory.Exists(@FolderPath + "/" + itemid);
bool isSpotlight = false;
string spotlightThumbPath = "";
string thumbPath = "";
string thumbname = "";
string spotlightName = "";
int thumbPosition = 0;
int spotlightPosition = 0;
int counter = 0;
int rptrCount = 0;
/////PART I DON'T QUITE UNDERSTAND
var query = null; //I know this is impossible
//select the Table to query
switch (FolderName)
{
case "NewsManager":
query = (from q in db.News Where q.ID == itemID select q);
break;
case "ProductsManager":
query = (from q in db.Products Where ...
break;
case "ProjectsManager":
query = ... db.Projects ...
break;
case "CalendarManager":
query = ... db.Events ...
break;
}
/////
if (query.Count > 0)
{
var uniqueItm = query.First();
isSpotlight = Convert.ToBoolean(uniqueItm.isSpotlight);
thumbPath = uniqueItm.thumbnailPath;
spotlightThumbPath = uniqueItm.spotlightThumbPath;
thumbname = Path.GetFileNameWithoutExtension(thumbPath);
spotlightName = Path.GetFileNameWithoutExtension(spotlightThumbPath);
if (dirExist)
{
if (!String.IsNullOrWhiteSpace(FolderPath))
{
List<string> fileNames = GetFiles(FolderPath + "/" + itemid, "*.bmp|*.gif|*.jpg|*.jpeg|*.png", SearchOption.TopDirectoryOnly);
var files = (from f in fileNames
where (!f.Contains("_Thumb")) && (!f.Contains("_SpotlightThumb"))
select new
{
FilePath = f,
FileName = System.IO.Path.GetFileName(f)
});
if (files.Count() > 0)
{
imagesRepeater.DataSource = files;
imagesRepeater.DataBind();
foreach (var img in files)
{
if (thumbPath != "" && thumbPath != null)
{
if (img.FileName.Contains(thumbname.Replace("_Thumb", "")))
{
thumbPosition = counter;
}
}
if (spotlightThumbPath != "" && spotlightThumbPath != null)
{
if (img.FileName.Contains(spotlightName.Replace("_SpotlightThumb", "")))
{
spotlightPosition = counter;
}
}
counter++;
}
if (isSpotlight)
{
foreach (RepeaterItem item in imagesRepeater.Items)
{
LinkButton spotlightLnkBtn = (LinkButton)item.FindControl("useAsThumbnailSpotlight");
spotlightLnkBtn.Visible = true;
if (thumbPath != "" && thumbPath != null)
{
if (rptrCount == thumbPosition)
{
Label myThumbImage = (Label)item.FindControl("lblThumb");
myThumbImage.Visible = true;
}
}
if (spotlightThumbPath != "" && spotlightThumbPath != null)
{
if (rptrCount == spotlightPosition)
{
Label mySpotlightImage = (Label)item.FindControl("lblThumbSpotlight");
mySpotlightImage.Visible = true;
}
}
rptrCount++;
}
}
else
{
foreach (RepeaterItem item in imagesRepeater.Items)
{
if (thumbPath != "" && thumbPath != null)
{
if (rptrCount == thumbPosition)
{
Label myThumbImage = (Label)item.FindControl("lblThumb");
myThumbImage.Visible = true;
}
}
if (spotlightThumbPath != "" && spotlightThumbPath != null)
{
if (rptrCount == spotlightPosition)
{
Label mySpotlightImage = (Label)item.FindControl("lblThumbSpotlight");
mySpotlightImage.Visible = true;
}
}
rptrCount++;
}
}
uniqueItm.hasImages = true;
db.SaveChanges();
lblEmptyData.Visible = false;
}
else
{
uniqueItm.hasImages = false;
db.SaveChanges();
lblEmptyData.Visible = true;
}
}
}
}
else
{
lblEmptyData.Visible = true;
}
}
私は役に立たなかったいくつかの異なることを試しました。私はちょっと困惑しています。それを解決する「varクエリ」をNULLにできれば、もちろん、この変数は暗黙的に型指定されているため、これは不可能です。
「var」を使用する以外に、変数を宣言する方法が必要です...
誰かが何か考えを持っているなら、私は本当に感謝しています. 私は十分に簡潔だったことを願っています。
前もって感謝します