2014-08-30 21 views
0

我使用實體框架6.0.1,我有一個問題:LINQ到實體不能編譯商店表達

我的下一個DB結構:

public class User 
{ 
    int Id { get; set;} 
    string E-mail {get; set;} 
    string Name {get; set;} 
    ... 
} 

class House 
{ 
    string Id {get; set;} 
    string Name { get; set; } 
    string Street { get; set; } 
    . . . 
    IQueryable<User> Users { get; set; } 
} 

家家戶戶都可以鏈接到許多用戶。任何用戶都可以鏈接到許多房屋。

我需要創建一個查詢,在其中獲得一個特定用戶所附的房屋列表 我只知道用戶標識。

我寫了下面的語句:

var houses = this.context.Houses 
       .Where(house => house.Users.Any(i => i.Id == my_searched_user_id)); 

,但我得到的錯誤:LINQ到實體無法識別方法「System.String ElementAtOrDefault [字符串](System.Collections.Generic.IEnumerable`1 [系統.String],Int32)'方法,並且此方法不能轉換爲商店表達式。

我將其更改爲

var houses = this.context.Houses 
       .Where(house => house.Users.**ToList()**.Any(i => i.Id == my_searched_user_id)); 

,但沒有任何運氣:(

+1

在您發佈的代碼中沒有關於'ElementAtOrDefault'的內容。你以後如何使用'房屋'變量?這很重要,因爲LINQ執行是延遲的,所以你顯示的代碼實際上並不執行任何數據庫查詢,它只是創建一個查詢定義,這可能會隨着進一步的方法調用而改變。 – MarcinJuraszek 2014-08-30 05:34:19

回答

1

你在錯誤的地方添加ToList嘗試下一編碼:

 var houses = this.context.Houses 
      .Where(house => house.Users.Any(i => i.Id == my_searched_user_id)) 
      .ToList(); 

ToList會投給IQueryable的IEnumerable的,所以查詢將會被執行。

0

你不應該定義你的Users集合是一個IQueryable。它應該是一個ICollection:

public virtual ICollection<User> Users {get;set} 

我很驚訝,即使編譯...但仍然,這不是你的問題。您的問題出現在您未顯示的代碼中。你需要顯示所有的代碼,因爲別的東西導致了這個錯誤,這與索引一個字符串變量有關。

相關問題