动态构建 Func 列表- 然后应用于 linq 查询
不确定这是否是最好的方法,但是这是我的想法
我正在使用实体框架数据模型 v 4.1 - 我正在尝试动态构建一个 where 语句,这样我就不必每次都查询数据库,而是可以构建一个“列表”条件,然后一次应用它们,这样数据库只被查询一次,而不是每次我添加新的条件 - 如果这有意义......
这是我所拥有的,
List<Func<Order, bool>> orderFunctions = new List<Func<Order, bool>>();
if (this.LoggedInUser.UserId == 9)
{
Func<Order, bool> deleg = o => o.Status.Equals(OrderStatus.NewOrder);
orderFunctions.Add(deleg);
}
else if (this.LoggedInUser.UserId == 22)
{
Func<Order, bool> deleg = o => o.AssignedToUserId.Equals(22);
orderFunctions.Add(deleg);
}
List<Orders> orders = Entities.Orders.Where( Some How Apply my Order Functions List Here ).ToList();
我不确定我是否即使在这里采取正确的方法 -希望这是有道理的 - 任何指导,示例代码都会很棒,我花了很多时间在网上寻找示例/教程
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您只需多次调用
Where
即可完成此操作:在您开始尝试检索结果之前,它不会联系数据库。
如果您确实想要创建一个列表,则需要创建一个
List>>
- 它们必须是表达式树而不是委托,以便实体框架可以处理它们。然后你可以这样做:或者你可以使用
PredicateBuilder
来构建单个表达式树。You can do this just by calling
Where
multiple times:Until you start trying to retrieve the results, it won't contact the database.
If you really want to create a list, you'd need to create a
List<Expression<Func<Order, bool>>>
- they have to be expression trees rather than delegates, so that the Entity Framework can deal with them. Then you could just do:Or you could use
PredicateBuilder
to build up a single expression tree.乔恩当然给出了如何做得更好的答案。
但对于你最初的观点,以及为什么这不起作用:
应用洞列表并不困难(只需执行
),但你不会从中得到任何 SQL-love - 这意味着你会得到一个错误,因为 EF 不知道什么与所有(或您将在那里编码的任何内容)有关。
您必须查询所有条目(使用 ToList 或 ToArray),之后它将起作用......但没有性能;)
Jon gave - of course - the answer how to do this better.
But for your original point, and why this won't work:
It is not dificult to apply the hole list (just do
) but you will not get any SQL-love from this - meaning you will get an error because EF cannot know what to do with the all (or whatever you will code there).
You would have to query all entries (with ToList, or ToArray) and after this it would work ... but without performance ;)