4

在整個我們的應用程序中發生在許多不同查詢中的一些特定標準緩慢地變得更加複雜。爲了避免這種代碼的重複,我想出來拆分這些標準成返回條件爲表達可以依次施加在必要的方法:LINQ to Entities查詢中的可重複使用的謂詞表達式

public Expression<Func<Invoice, bool>> GetComplexPredicate() 
{ 
    // complex predicate is returned as an Expression: 
    return c => ... 
} 

重新用作例如:

var result = repository.Invoice.Where(GetComplexPredicate()) 

但是,下面的說明將不會編譯,因爲c .voice只是一個ICollection

var result = repository.Customer 
    .Where(c => c.Country == "US" && c.Invoice.Any(GetComplexPredicate())) 

以任何方式使用這種表達方式嗎?

回答

4

有兩個部分對這個問題:

如何使用L2E查詢裏面的導航屬性謂詞表達式?

L2E允許在查詢中使用AsQueryable擴展方法的。這意味着我可以將ICollection轉換爲IQueryable並應用謂詞表達式。到現在爲止還挺好。但是,它可能會編譯,但它仍然不會運行,因爲L2E不知道如何處理來自GetComplexPredicate方法的預定義表達式。這導致我們:

如何將幾個單獨的謂詞表達式合併爲一個?

的極大有用LINQKit可以很容易地將幾個謂詞成使用PredicateBuilder一個表達。

// build the entire predicate beforehand (PredicateBuilder + AsQueryable): 
var complexPredicate = GetComplexPredicate(); 
var condition = PredicateBuilder.True<Customer>() 
    .And(c => c.Country == "US") 
    .And(c => c.Invoice.AsQueryable().Any(complexPredicate)); 

// apply criteria to query (using Expand): 
var result = repository.Customer.Where(condition.Expand()).ToList(); 
:隨着 展開從LINQKit方法和上述 AsQueryable已,我們終於可以在任何能編譯和運行優美的一份聲明中到達