LINQ to Entities可以';t编译存储表达式

本文关键字:编译 存储 表达式 to Entities 可以 LINQ | 更新日期: 2023-09-27 18:20:11

我使用实体框架6.0.1,我有下一个问题:

我有下一个数据库结构:

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; }
}

每个House都可能链接到许多用户。任何用户都可能链接到许多房屋。

我需要创建一个查询,在其中获取特定用户所附的房屋列表我只知道用户Id。

我写了下一个声明:

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

但我收到错误:LINQ to Entities无法识别方法"System.String ElementAtOrDefault[String](System.Collections.Generic.IEnumerable`1[System.String],Int32)",并且此方法无法转换为存储表达式。

我把它改成

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

但没有任何运气:(

LINQ to Entities可以';t编译存储表达式

您在错误的位置添加了ToList。尝试下一个代码:

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

ToList将IQueryable强制转换为IEnumerable,因此将执行查询。

您不应该将Users集合定义为IQueryable。它应该是一个ICollection:

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

我很惊讶,甚至编译。。。但是,这并不是你真正的问题。您的问题出现在未显示的代码中。您需要显示所有代码,因为其他原因导致了此错误,这与索引字符串变量有关。