动态查询:在LINQ-to-Entities查询中更改表名称
长时间潜伏者,最近的新人。动态查询:在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”能够解决它,但是,当然,这是不可能的,因为这个变量是隐含类型的。
必须有申报我变量除了使用“无功”的方式...
如果任何人有任何想法,我会很感激。我希望我已经足够简明。
在此先感谢
通过看你如何使用您的查询,似乎你的结果是强类型 ...
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
}
其实我可以有我的头顶上有一个解决方案:
注:该解决方案没有经过测试。
第一:
在你的情况下,var result
,就像你说的,是隐式类型。但实际上它相当于IEnumerable<object> result
。您可以使用IEnumerable<object> result = null
或IEnumerable<object>? result
来接受可为空的值。
第二:
第二种解决方案将包括查询部分移动到其自己的方法,接受字符串参数,返回的对象集合或可空的IEnumerable<T>?
集合。
问候!
另一种解决方案解决我的问题的对象,但您的解决方案是有道理也。我会在以后记住这一点。感谢您花时间寻找解决方案。 – IndieRok 2013-05-08 13:34:35
哦,我的上帝,我甚至不知道这是可能的......实际上是这样做的。 :) 非常感谢你! 我想我只是平了一些 – IndieRok 2013-05-08 13:28:31