C# NotSupportedException:LINQ to实体无法识别该方法
我正在尝试使用EF执行此查询,但它引发了一个异常:C# NotSupportedException:LINQ to实体无法识别该方法,c#,.net,entity-framework,linq,C#,.net,Entity Framework,Linq,我正在尝试使用EF执行此查询,但它引发了一个异常: var c = ac.Communities.OrderBy(o => o.Posts.Count()) .Skip(page*limit) .Take(limit) .Select(o => o.ToViewModel()).ToArray(); Community模型中的ToViewModel()方法如下所示: public CommunityModel ToViewModel(
var c = ac.Communities.OrderBy(o => o.Posts.Count())
.Skip(page*limit)
.Take(limit)
.Select(o => o.ToViewModel()).ToArray();
Community
模型中的ToViewModel()
方法如下所示:
public CommunityModel ToViewModel()
{
return new CommunityModel()
{
category = Category.Name,
created = CreationTime,
description = Description,
id = Id,
name = Name,
ownerId = Owner.Id,
postsCount = Posts.Count(),
score = Posts.Sum(o => o.Likes - o.Unlikes),
shortDescription = ShortDescription,
subscribersCount = Subscribers.Count(),
};
}
我做错了什么?这是因为LINQ转换为实体时,尝试将
.ToViewModel
转换为SQL查询,而转换程序无法识别该查询
如果.Take
返回的结果不多,那么最好的解决方案是将IQueryable
转换为列表
,方法是将其更改为以下内容
var c = ac.Communities.OrderBy(o => o.Posts.Count())
.Skip(page*limit)
.Take(limit)
.ToArray() // This will return a Community array
.Select(o => o.ToViewModel()) // This is a IEnumerable<CommunityModel>
.ToArray(); // This will cast // This is a cast for Community array
var c=ac.Communities.OrderBy(o=>o.Posts.Count())
.跳过(第*页限制)
.接受(限制)
.ToArray()//这将返回一个社区数组
.Select(o=>o.ToViewModel())//这是一个IEnumerable
.ToArray();//这将强制转换//这是对社区阵列的强制转换
实体框架无法将您在中使用的方法转换为ViewModel
。使用ToList()
急切地加载结果,然后映射这些结果,避免EF尝试转换SQL:
var c = ac.Communities.OrderBy(o => o.Posts.Count())
.Skip(page*limit)
.Take(limit)
.ToList()
.Select(o => o.ToViewModel()).ToArray();
若要排除您的
ToViewModel
方法,请在前面弹出一个.ToList()
,然后选择,看看您是否仍然存在此问题。@Stuart,谢谢!因此,基本上,列表
不再是一个IQueryable
,因此它不会尝试将其转换为数据库的SQL查询,对吗?这意味着它在内存中执行所有这些操作,将社区
类视为实际对象,而不是db实体,对吗?没错,您在使用ToList
时强制枚举IQueryable
,然后,下面的Linq方法作用于内存中的集合,不必担心转换为SQLYes,这就是我要使用的。谢谢不过出于好奇:接受这一点是因为LINQ转换为实体,尝试将.ToViewModel转换为SQL查询,而转换程序无法识别该查询。如果.Take返回的结果不多,那么最好的解决方案是将IQueryable转换为List,方法是将其更改为以下内容。。。。否则?