Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NotSupportedException:LINQ to实体无法识别该方法_C#_.net_Entity Framework_Linq - Fatal编程技术网

C# NotSupportedException:LINQ to实体无法识别该方法

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(

我正在尝试使用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()
{
    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,方法是将其更改为以下内容。。。。否则?