2017-01-03 84 views
1

我试图与EF此查询工作,但它抛出一个异常:NotSupportedException异常:LINQ到实体无法识别方法

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(), 
    }; 
} 

我在做什么错?

+0

为了排除你的'ToViewModel'方法,弹出一个'.ToList()'在前面的'选择',看看你是否仍然存在这个问题。 – Stuart

+0

@Stuart工作,谢谢!所以,基本上,'List'不再是'IQueryable',因此它不会将它转换为数据库的SQL查询,对吧?这意味着它在内存中完成所有工作,将'Community'类视为实际对象,而不是实体对象,对吗? – Reynevan

+0

这是正确的,你在强制使用'ToList'的时候'IQueryable'的枚举,那么后面的Linq方法正在处理内存集合,并且不必担心转换为SQL – Stuart

回答

2

实体框架不能转换您正在使用内ToViewModel方法。使用ToList()热切加载结果,然后映射那些代替,避免了需要EF尝试翻译的SQL:

var c = ac.Communities.OrderBy(o => o.Posts.Count()) 
    .Skip(page*limit) 
    .Take(limit) 
    .ToList() 
    .Select(o => o.ToViewModel()).ToArray(); 
1

这是因为LINQ to Entities,试图将.ToViewModel转换为SQL查询,这是转换器无法识别的。

如果.Take没有返回很多结果,那么最好的解决办法是将IQueryable更改为List,方法是将其更改为以下内容。

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 
+0

是的,这就是我会用什么。谢谢。只是出于好奇,尽管: 接受 这是因为LINQ to Entities,尝试将.ToViewModel转换为SQL查询,这是转换器无法识别的。 如果没有很多结果被.Take返回,那么您的最佳解决方案将通过将IQueryable更改为List来将其转换为以下....否则...? – Reynevan

相关问题