【发布时间】:2013-06-07 07:36:56
【问题描述】:
我正在转换 ADO.NET 应用程序以使用 Entity Framework 5,并且在重新编写搜索功能时遇到了问题。我已经分离了 UI 和 DB 层,DB 层现在有一个内部 edmx 并公开数据检索方法。
其中一种方法是搜索。因为该函数不再能够直接访问表单控件值(曾经有一个关于 UI 代码隐藏文件的 LINQ 查询)我创建了一个类来允许表单传递这些值
public class SearchParameter
{
public string Name { get; set; }
public bool Checked { get; set; }
public object Value { get; set; }
}
我知道这会导致值装箱,但我看不到任何其他允许多种值类型的方法
搜索功能是这样的
public static IList SearchRecords(IList<SearchParameter> searchParams)
{
using (var db = new EarnieEntities())
{
var result = db.Non_Conformance;
//Filter Results based on params
foreach (var p in searchParams.Where(p => p.Checked))
{
switch (p.Name)
{
case "NCID":
break;
case "DateRaised":
break;
case "RaisedBy":
break;
case "RaisedFor":
break;
}
}
return result.ToList();
}
}
在每种情况下使用 LINQ to SQL,我都可以编写类似这样的内容来过滤该字段的结果集
result = result.Where(x => x.NC_ID == (int) p.Value).Select(x => x);
使用 LINQ to SQL 的想法是利用延迟加载并允许在访问结果之前进行所有过滤。这允许用户在 UI 上选择字段并构建他们的搜索条件。
使用 EF,我得到了
您无法将源类型 Linq.IQueryable
转换为目标类型 Data.Entity.DbSet
还有其他方法可以进行这种过滤吗?
[更新]
如果我尝试简单地将结果转换为 DbSet,我会得到另一个错误
无法投射“System.Data.Entity.Infrastructure.DbQuery
1[EarnieDAL.Sources.Non_Conformance]' to type 'System.Data.Entity.DbSet1[EarnieDAL.Sources.Non_Conformance]”类型的对象
【问题讨论】:
-
不幸的是我现在不能检查它,但是如果你替换 'var result = db.Non_Conformance;' with var 'result = db.Non_Conformance.Select(x=>x);'
-
facepalm 现在会尝试,但我认为就是这样
-
非常感谢 Uriil,当机立断。
标签: c# linq entity-framework entity-framework-5