如何在LINQ查询中优先处理过滤,最好是Lambda格式?

时间:2014-10-02 23:24:02

标签: asp.net-mvc linq asp.net-mvc-3 asp.net-mvc-4 linq-to-entities

我的示例查询是:

db.Supplier.Where(r=>r.Category.Name=="Food" && r.SupplierType.Code=="ShortValue" && Model.Pattern.Contains(r.Value))))

我想先做这件事:

db.Supplier.Where(r=>r.Category.Name=="Food" && r.SupplierType.Code=="ShortValue"

然后将以下内容应用于结果集:

 && Model.Pattern.Contains(r.Value)

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

试试这个:

var result = db.Supplier.Where(r=>r.Category.Name=="Food" && r.SupplierType.Code=="ShortValue");
result = result.Where(r=>Model.Pattern.Contains(r.Value));

答案 1 :(得分:1)

如果只是你担心的速度,我猜你不想对表格中的所有内容执行Contains(),你只想找到符合前2条规则的所有结果然后检查它们是否包含正确的值,在这种情况下你可以这样做:

var result = db.Supplier.Where(r=>r.Category.Name=="Food" && 
                               r.SupplierType.Code=="ShortValue").ToList();
result = result.Where(r=>Model.Pattern.Contains(r.Value));

通过添加.ToList(),这会强制查询返回结果,然后查询第一个结果集。

或者,您可以让.Net Framework找出执行查询的最佳方式,并执行以下操作:

IQueryable<Suppliers> results = db.Supplier.Where( x  => x.Category.Name == "Food");
results = results.Where(x => x.SupplierType.Code == "ShortValue");
results = results.Where( x => Model.Pattern.Contains(x.Value);

请注意,当您使用Iqueryable<>时,.Net将延迟执行,并且被要求优先处理订单以及如何执行搜索

真正的区别在于你想在DB中做什么部分,你想在内存中做什么部分?你可以用不同的方式使用Ienumerable和IQueryable来返回不同的结果,你可以拥有在db中完成的所有fintering只返回你想要的确切结果,或者你可以在done中完成部分查询,然后返回内存,然后执行过滤器的第二部分。选择哪一个真的取决于你的应用程序,但大部分时间减少内存并让数据库做出努力是最好的选择。