2013-08-27 30 views
0

條款我有一個POCO實體,看起來像空支票其中EF

public class Rebate : IEntity 
{ 
    [Key] 
    public int Id { get; set; } 

    [ForeignKey("ClassOneId")] 
    public virtual ClassOne ClassOne { get; set; } 
    public int ClassOneId { get; set; } 

    [ForeignKey("ClassTwoCode")] 
    public virtual ClassTwo ClassTwo { get; set; } 
    public string ClassTwoCode { get; set; } 

    public double Rebate { get; set; } 

} 

如果ClassOne有值ClassTwo將是空,反之亦然,現在當我想運行一個查詢檢查name屬性

var predicate = PredicateBuilder.True<Rebate>(); 
     if (!string.IsNullOrEmpty(term)) 
      predicate = predicate.And(x => (x.ClassOne != null ? 
       x.ClassOne.Name.Contains(term) : x.ClassTwo.Name.Contains(term))); 

OR

:使用 linqkit每個類的

在這兩種情況下,我都會得到結果,其中ClassOne與期限匹配,但沒有結果,其中ClassTwo匹配。

我對發生的事情的理解是,當ClassOne爲空時,查詢失敗並且未檢查ClassTwo的名稱屬性。我不確定的是如何解決這個問題,而無需單獨運行查詢併合並結果。

任何人有更好的計劃?

回答

0

這是行不通的?

x => (x.ClassOne != null && x.ClassOne.Name.Contains(term)) || 
    (x.ClassTwo != null && x.ClassTwo.Name.Contains(term)) 

我知道EF會比,如果你用的,因爲SQL需要如何處理它們在內存中的對象的工作不同的方式處理null檢查。如果這不起作用,請嘗試在LINQPad中運行您的查詢,並檢查執行了哪些SQL並檢查它是否有意義。