2013-05-07 3 views
2

Долгое время 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 выполнить свой «запрос на поиск», который бы разрешил его, но, конечно, это невозможно, поскольку эта переменная неявно напечатана.

Там должен быть способ, чтобы объявить мою переменную другой, чем использование «вар» ...

Если у кого есть какие-либо идеи, я был бы очень признателен. Надеюсь, я был достаточно сжатым.

Заранее спасибо

ответ

3

Глядя на то, как вы используете свой запрос, то кажется, что ваш результат сильно типизированных ...

var uniqueItm = query.First(); 

    isSpotlight = Convert.ToBoolean(uniqueItm.isSpotlight); 
    thumbPath = uniqueItm.thumbnailPath; 
    spotlightThumbPath = uniqueItm.spotlightThumbPath; 

Каждый запрос должен возвращать результат, который имеет isSpotlight, thumbnailPath, свойства spotlightThumbPath. Так почему бы не создать класс для этого:

public class MyQueryResult 
{ 
    public bool isSpotlight{get;set;} 
    public string thumbPath{get;set;} 
    public string spotlightThumbPat{get;set;} 
} 

И типа все ваши запросы, чтобы вернуть объекты из MyQueryResult

IQueryable<MyQueryResult> query = null; //This is now possible 
//select the Table to query 
switch (FolderName) 
{ 
    case "NewsManager": 
     query = from q in db.News Where q.ID == itemID 
       select new MyQueryResult 
       { 
        isSpotLight=q.Something, 
        thumbPath = q.SomethingElse 
        etc... 
        } 
     break; 
    case "ProductsManager": 
     query = (from q in db.Products Where ... 
       select new MyQueryResult 
       { 
        ---fill properties 
       } 
     break; 
    .... same thing for every case 
    } 

    var uniqueItm = query.FirstOrDefault(); 
    if (uniqueItm!=null) 
    { 
     ... do your thing with uniqueItm 
    } 
+1

О, боже, я даже не знал, что это возможно ... это на самом деле трюк. :) Большое спасибо! Наверное, я только что повысил уровень – IndieRok

0

На самом деле я могу иметь решение на верхней части моей головы:

Примечания: Решение не тестируется.

Первое:

В вас случае, var result, как вы сказали, неявно набирается. Но на самом деле это эквивалентно IEnumerable<object> result. Вы могли бы использовать IEnumerable<object> result = null или IEnumerable<object­>? result вместо этого, чтобы принять значение с нулевым значением.

Второго:

Второе решение будет состоять из перемещения части запроса в свой собственный метод, принимающий параметр строки, возвращая коллекцию объектов или обнуляемый IEnumerable<T>? коллекции.

С уважением!

+0

Другое решение решить мою проблему, но ваше решение имеет смысл также. Я буду помнить об этом позже. Спасибо, что нашли время, чтобы найти решение. – IndieRok

Смежные вопросы