Долгое время lurker, недавний новичок.Динамические запросы: изменить имя таблицы в запросе LINQ-to-Entities
Был битком с запросами с LINQ-to-Entities. Я использую Visual Studio Express 2012 для Web и Entity Framework 4.0. Потерпите меня, это длинное объяснение, чтобы я все покрыл. Вот ситуация:
У меня есть страница с многократным использованием .aspx, которая действует как менеджер изображений. Он имеет элемент управления Ajax Toolkit FileUpload, а также ретранслятор для отображения загруженных файлов. Я обращаюсь к этому Менеджеру в Fasebox Modal Pop-up (iframe). В открывшемся URL-адресе есть 2 параметра, «ID» и «Тип».
В моем файле управления ImageManager у меня есть функция, которая связывает все изображения с ретранслятором. В этой функции мне нужно запросить таблицу базы данных в соответствии с «Типом» (параметр 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;
}
}
Я пробовал несколько разных вещей, которые были бесполезны. Я немного в тупике. Если бы я мог NULL выполнить свой «запрос на поиск», который бы разрешил его, но, конечно, это невозможно, поскольку эта переменная неявно напечатана.
Там должен быть способ, чтобы объявить мою переменную другой, чем использование «вар» ...
Если у кого есть какие-либо идеи, я был бы очень признателен. Надеюсь, я был достаточно сжатым.
Заранее спасибо
О, боже, я даже не знал, что это возможно ... это на самом деле трюк. :) Большое спасибо! Наверное, я только что повысил уровень – IndieRok