2011-06-16 39 views
0

我有一個類的方法方法不能被翻譯成店的表達,但它的機身可以

public partial class User 
{ 
    public IEnumerable<Event> GetLikedEvents() 
    { 
     return this.Operations.Where(o => o.typeId == 
      Consts.MarkAsLikedOperationTypeId).Select(o => o.Event); 
    } 
} 

和表達的評估

IQueryable<User> users = repository.GetUsers(). 
    Where(u => u.GetLikedEvents().Any(e => e.id == likedEventId)); 

拋出異常LINQ到實體無法識別方法GetLikedEvents()方法,並且此方法不能轉換爲商店表達式。

但如果我的方法的複製體,以表達這樣

IQueryable<User> users = repository.GetUsers(). 
    Where(u => u.Operations. 
      Where(o => o.typeId == Consts.MarkAsLikedOperationTypeId). 
      Select(o => o.Event). 
      Any(e => e.id == likedEventId)); 

它的翻譯沒有錯誤。

所以我很感興趣如果我要在不同的地方進行不同的喜歡事件檢查,我該如何避免代碼重複?

回答

1

您從方法中複製的塊與方法不同。有一個很大的區別,因爲你的方法在已經加載的操作上作爲linq-to-objects運行,而你的第二個查詢在數據庫中作爲linq-to-entities運行。嘗試這種方式重寫方法:

public static IQueryable<Event> GetLikedEvents(this IQueryable<Operation> query, int typeId) 
{ 
    return query.Where(o => o.typeId == typeId).Select(o => o.Event); 
} 

而且你的主查詢爲:

IQueryable<User> users = repository.GetUsers() 
    .Where(u => u.Operations.GetLindedEvents(Consts.MarkAsLikedOperationTypeId) 
          .Any(e => e.id == likedEventId)); 
相關問題