2014-06-19 64 views
1

我希望能夠爲一個LINQ下面的代碼寫入到實體查詢(EF6)構建表達樹LINQ到實體Where子句

Repo.ContactRelations.WhereActive() 
       .Select(r => new ContactModel 
       { 
        Id = r.Contact.Id, 
        FirstName = r.Contact.FirstName, 
        LastName = r.Contact.Surname, 
        WorkEmail = r.Contact.WorkEmail 
       }) 

沒有WhereActive()方法,我將不得不重複在許多地方下面的表達式:

Repo.ContactRelations.Where(c => c.EndDate == null || c.EndDate > DateTime.Today) 

我試着寫一個簡單的擴展方法,但它給了一個錯誤「LINQ到實體無法識別方法WhereActive」

public static IEnumerable<T> WhereActive<T>(this IEnumerable<T> source) where T : class, IMayExpire 
    { 
     return source.Where(c => c.EndDate == null || c.EndDate > DateTime.Today); 
    } 

在閱讀了LINQ to Entities vs LINQ to Object,以及Expression樹vs Func <>之後,我意識到需要構建一個完整的Expression樹來表達我的意圖。

我不知道該怎麼做,請問可以幫忙嗎?

+0

通過本身的代碼應該不會導致該錯誤。你是用它作爲另一個查詢或類似的東西的子查詢? – svick

回答

1
public static IQueryable<T> WhereActive<T>(this IQueryable<T> source) where T : class, IMayExpire 
{ 
    return source.Where(c => c.EndDate == null || c.EndDate > DateTime.Today); 
} 

編輯。這應該有工作......但是如果它沒有你有兩個選擇......

var activeContactRelations = Repo.ContactRelations.WhereActive(); 
var result = activeContactRelations 
      .Select(r => new ContactModel 
      { 
       Id = r.Contact.Id, 
       FirstName = r.Contact.FirstName, 
       LastName = r.Contact.Surname, 
       WorkEmail = r.Contact.WorkEmail 
      }) 

OR

using System.Linq; 

public static Expression<Func<T, bool>> IsActive<T>() where T : class, IMayExpire 
{ 
    return c => c.EndDate == null || c.EndDate > DateTime.Today; 
} 

var isActive = IsActive<ContactRelation>(); 
var result = Repo.ContactRelations.Where(isActive) 
      .Select(r => new ContactModel 
      { 
       Id = r.Contact.Id, 
       FirstName = r.Contact.FirstName, 
       LastName = r.Contact.Surname, 
       WorkEmail = r.Contact.WorkEmail 
      }) 
+0

感謝您的回覆阿隆,但你的建議沒有奏效。我仍然收到相同的錯誤: LINQ to Entities無法識別方法'System.Linq.IQueryable'1 [ContactRelation] WhereActive [ContactRelation](System.Linq.IQueryable'1 [ContactRelation])'方法,以及此方法不能轉換爲商店表達式。 它不需要重寫Where()表達式和我的自定義表達式到一個單一的表達式爲了讓LINQ翻譯? – ozstudent

+0

很奇怪。它並沒有減少它...... – Aron

+0

我可能不是100%正確的,但在其他問題中,至少傳入INTO WhereActive的參數與聲明WITHIN WhereActive的參數不同。即。當調用ContactRelations.WhereActive時,會有一個參數(例如可以被稱爲「i」)傳遞給WhereActive,並且它與在...中聲明的參數「c」無關(基於我的理解有限) – ozstudent