2014-08-30 59 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} 

我很惊讶,即使编译...但仍然,这不是你的问题。您的问题出现在您未显示的代码中。你需要显示所有的代码,因为别的东西导致了这个错误,这与索引一个字符串变量有关。