方法x没有支持的SQL转换

时间:2011-03-15 08:47:21

标签: c# .net linq-to-sql

我想编写一个查询,该查询应该获取用户对象以及用户已经发布的消息量。我通过以下方式做到了这一点:

var query = (from u in _db.Repository<User>()
             where u.IsDeleted != true
             select new UserWithMessagecount()
             {
                 User = u
                 MessageCount = GetUserMessageCount(u.Documents).Count(),
             });

我正在使用某种方法,因为某些消息应该被过滤掉(以动态方式)

为了简单起见,我将发布没有排序逻辑的函数(它仍会产生相同的错误)。

    private EntitySet<Document> GetUserMessageCount(EntitySet<Document> set)
    {
        return set;
    }

返回的错误是:

方法'x'没有支持的SQL转换。

有关如何解决此问题的任何想法?

3 个答案:

答案 0 :(得分:7)

Linq-to-SQL将尝试将您的整个语句转换为SQL,当然没有GetUserMessageCount()可用。

您需要通过枚举来获取SQL查询的结果 - 然后应用C#端逻辑。

答案 1 :(得分:7)

请改用此语法:

 var query = (from u in _db.Repository<User>()
             let MessageCount = GetUserMessageCount(u.Documents).Count()
             where u.IsDeleted != true
             select new UserWithMessagecount()
             {
                 User = u,
                 MessageCount = MessageCount
             });

答案 2 :(得分:0)

您需要做的是在投影中使用分组。

var query = from u in _db.Repository<User>()
            where !u.IsDeleted
            group u by u.UserId into g
            select new UserWithMessageCount {
               User = g.First(x => x.UserId == g.Key),
               MessageCount = g.Sum(x => x.Messages.Count())
            }

这应该有用。