在实体框架中使用动态 where 子句
Posted
技术标签:
【中文标题】在实体框架中使用动态 where 子句【英文标题】:Using dynamic where clauses in Entity Framework 【发布时间】:2011-05-11 01:03:50 【问题描述】:我正在尝试重新设计最初使用 Raptier 构建的数据访问层。 Raptier 生成的方法接受 where 子句作为要传递给存储过程的参数。我真的需要保留现有的 mesthos 签名,所以我的新 DAL 也需要接受 where 子句。我想使用最新的数据访问技术和技巧,因此正在考虑使用 .Net 4.0 中的 Entity Framework。
但是,看起来我不能接受动态 where 子句而不执行一些密集的重例以将它们解析为 Lamba 表达式。有什么我错过的吗?我对实体框架不走运吗?
谢谢, 马克
【问题讨论】:
也许你应该给我们看一些代码。我想很多人都不知道 Raptier 的样子。 【参考方案1】:在此处查看 Rick Strahl 的博文:http://www.west-wind.com/weblog/posts/160237.aspx。他的演示使用 Linq to SQL,但在 EF 中并没有太大的不同。这种方法涉及将 IQueryable 暴露给业务层。这并非没有争议,但值得考虑。
通过公开 IQueryable,您可以针对返回的集合编写 LINQ 查询。我不保证你可以让它与 sprocs 一起工作,但试试看吧。
【讨论】:
【参考方案2】:您可以使用 ExecuteStoreQuery 方法对数据库执行原始命令。 http://msdn.microsoft.com/en-us/library/ee358769.aspx
【讨论】:
【参考方案3】:想到了两个想法。
1)。 Dynamic LINQ,它允许您将 where 运算符定义为字符串。
var result = Northwind.Products
.Where("CategoryId=2 And UnitPrice>3")
.OrderBy("SupplierId");
2)。使用EntityFilter<T>
(参见代码here),它允许您定义这样的过滤器:
IEntityFilter<Person> entityFilter =
from person in EntityFilter<Person>.AsQueryable()
where person.Name.StartsWith("a")
where person.Id < 100
select person;
您可以将IEntityFilter<Person>
提供给能够过滤该查询的业务方法:
public static Person[] GetAllPersons(
IEntityFilter<Person> filter)
using (var db = ContextFactory.CreateContext())
IQueryable<Person> filteredList =
filter.Filter(db.Persons);
return filteredList.ToArray();
【讨论】:
Steven 的选项 1 看起来最接近我们现在所做的。这可能行得通!感谢大家的回复! Dynamic LINQ 看起来很整洁。【参考方案4】:面临同样的问题,现在 raptier 停产可能是,好吧
我有一个线索,因为我使用的是仅支持 15 个表/视图的 lite 版本.. 这是一条捷径,,
始终在服务器中获取一个虚拟测试数据库,并生成您想要的类,然后将其与您的类库解决方案合并,重新构建解决方案,然后继续进行到您想要的程度,
它很费力,但它的工作。
需要更多帮助,很高兴...
【讨论】:
以上是关于在实体框架中使用动态 where 子句的主要内容,如果未能解决你的问题,请参考以下文章
使用 Func<T, string> lambda 动态构造 where 子句 - linq 到实体
从选项(来自 rds - mysql)创建动态框架,提供带有 where 子句的自定义查询