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));
但没有任何运气:(
您在错误的位置添加了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}
我很惊讶,甚至编译。。。但是,这并不是你真正的问题。您的问题出现在未显示的代码中。您需要显示所有代码,因为其他原因导致了此错误,这与索引字符串变量有关。