0

我的示例查詢是:如何優先處理LINQ查詢中的過濾,最好是Lambda格式?

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) 

感謝您的幫助。

+0

我真的不明白這個問題,如果.Container()在同一個查詢中或在第一個查詢之後,它會如何影響結果? – 2014-10-03 02:04:53

+0

道歉。我需要應用第一個查詢,這會刪除大量r.Values長的垃圾記錄。第一個查詢應該返回大約5條記錄。然後,我可以將「包含」應用於這5條記錄,其中最大長度爲50個字符。 – SamJolly 2014-10-03 02:26:16

回答

1

如果它只是你擔心,我猜你不想在表上的所有內容進行Contains()的速度,你只是想找到所有比賽第2條規則,然後檢查他們所有人,是否包含正確的價值的結果,在這種情況下,你可以這樣做:

加入 .ToList()這個強制查詢返回結果
var result = db.Supplier.Where(r=>r.Category.Name=="Food" && 
           r.SupplierType.Code=="ShortValue").ToList(); 
result = result.Where(r=>Model.Pattern.Contains(r.Value)); 

,然後查詢第一個結果組。

,或者你可以讓.Net框架弄清楚執行查詢,並完成類似的最佳途徑:

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<>則淨將推遲執行,並supposd到優先處理訂單以及如何執行搜索

真正的區別在於您想在數據庫中完成哪部分任務,以及您想在內存中完成哪部分任務?你可以用不同的方式使用Ienumerable和IQueryable來返回不同的結果,你可以在db中完成所有的fintering,只返回你想要的確切結果,或者你可以讓一部分查詢在done中完成並返回很多回到內存,然後過濾器的第二部分執行。選擇哪一個確實取決於你的應用程序,但是大多數情況下,將更少的內存帶入內存並讓db去完成這項工作是你最好的選擇。

+0

感謝您的支持。是的,我預計使用ToList()會強制DB執行第一個位,這會將結果集減少到大約5條記錄。然後我可以在記憶中做第二位。這實際上是SelectList()語句的一部分。是否有可能將兩個部分組合成一個LINQ查詢? – SamJolly 2014-10-03 02:22:57

+0

我認爲把這個減少到1行或1個查詢在我看來是不會做任何事情的,但是會讓讀者更加困惑,我認爲把它分成2份會讓你做得更明顯。 – 2014-10-03 02:27:32

+0

謝謝你的幫助。 – SamJolly 2014-10-03 02:37:12

1

試試這個:

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

謝謝。我希望能在相同的查詢中擁有它。另外第一個位需要先執行,因此「Contains」只應用於ResultSet1,而不是所有記錄。 – SamJolly 2014-10-03 01:33:04