2013-05-07 164 views
2

长时间潜伏者,最近的新人。动态查询:在LINQ-to-Entities查询中更改表名称

一直在用LINQ-to-Entities进行查询。我正在使用Visual Studio Express 2012 for Web和Entity Framework 4.0。忍受我,这是一个长期的解释,确保我覆盖一切。这里的情况:

我有一个可重用的.aspx页面充当图像管理器。它有一个Ajax Toolkit FileUpload控件,还有一个Repeater来显示上传的文件。我在Fancybox Modal Pop-up(iframe)中访问此管理器。它的开放网址有2个参数,一个“ID”和一个“类型”。

在我的ImageManager代码隐藏文件中,我有一个函数将所有图像绑定到中继器。在这个函数中,我需要根据“类型”(url参数)来查询数据库表......这正是问题所在。

对于我的生活,我不知道该怎么写一个动态的LINQ到实体查询,其中表名称将改变,根据更改的类型......

这里是功能(有问题的部分有意见):

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 query”能够解决它,但是,当然,这是不可能的,因为这个变量是隐含类型的。

必须有申报我变量除了使用“无功”的方式...

如果任何人有任何想法,我会很感激。我希望我已经足够简明。

在此先感谢

回答

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 2013-05-08 13:28:31

0

其实我可以有我的头顶上有一个解决方案:

注:该解决方案没有经过测试。

第一:

在你的情况下,var result,就像你说的,是隐式类型。但实际上它相当于IEnumerable<object> result。您可以使用IEnumerable<object> result = nullIEnumerable<object­>? result来接受可为空的值。

第二:

第二种解决方案将包括查询部分移动到其自己的方法,接受字符串参数,返回的对象集合或可空的IEnumerable<T>?集合。

问候!

+0

另一种解决方案解决我的问题的对象,但您的解决方案是有道理也。我会在以后记住这一点。感谢您花时间寻找解决方案。 – IndieRok 2013-05-08 13:34:35