【问题标题】:How to prioritise the filtering in LINQ queries, preferably Lambda format?如何优先考虑 LINQ 查询中的过滤,最好是 Lambda 格式?
【发布时间】:2014-10-02 23:24:02
【问题描述】:

我的示例查询是:

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)

感谢您的帮助。

【问题讨论】:

  • 我不太明白这个问题,如果 .Container() 在同一个查询中或在第一个查询之后会如何影响结果?
  • 道歉。我需要应用第一个查询,它会删除很多带有长 r.Values 的垃圾记录。第一个查询应该返回大约 5 条记录。然后,我可以将“包含”应用于这 5 条记录,其值的最大长度为 50 个字符。

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


【解决方案1】:

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

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&lt;&gt; 时,.Net 将延迟执行,并且应该优先考虑顺序以及如何执行搜索

真正的区别是你想在数据库中完成什么部分,你想在内存中完成什么部分?你可以用不同的方式使用 Ienumerable 和 IQueryable 来返回不同的结果,你可以有所有的筛选都在数据库中完成,只返回你想要的确切结果,或者你可以在 done 中完成部分查询,它将很多返回到内存,然后执行过滤器的第二部分。选择哪一个实际上取决于您的应用程序,但大多数情况下,减少内存并让 db 来完成工作是您最好的选择。

【讨论】:

  • 谢谢。是的,我预计使用 ToList() 会强制数据库执行第一位,从而将结果集减少到大约 5 条记录。然后我可以在内存中做第二位。这实际上是 SelectList() 语句的一部分。是否可以将这两个部分组合成一个 LINQ 查询?
  • 我认为在我看来将其减少到 1 行或 1 个查询不会做任何事情,只会进一步混淆读者,我认为将其分成 2 会使您所做的事情更加明显。
  • 感谢您的帮助。
【解决方案2】:

试试这个:

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

【讨论】:

  • 谢谢。我希望在同一个查询中有它。另外第一位需要先执行,所以“包含”应该只应用于 ResultSet1,而不是所有记录。
猜你喜欢
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 2011-03-09
  • 1970-01-01
  • 2023-03-15
  • 2023-03-09
相关资源
最近更新 更多