LINQ 表达式中的聚合函数引发错误.(无法转换为商店表达式

本文关键字:表达式 转换 错误 函数 LINQ | 更新日期: 2023-09-27 18:35:53

错误:LINQ to Entities 无法识别方法"System.String Aggregate[String,String](System.Collections.Generic.IEnumerable 1[System.String], System.String, System.Func 3[System.String,System.String,System.String])"方法,并且此方法无法转换为存储表达式。

林克表达式:

      Items = context.TESTANSWER.Where(x => x.ID == 6729223232)
            .Join(context.QUESTIONREPOs, x => x.QUESTIONID, y => y.ID, (x, y) => new { x = x, y = y })
            .Join(context.OPTIONREPOs, p => p.x.QUESTIONID, q => q.QUESTIONID, (p, q) => new { p = p, q = q }).Where(p => p.p.x.RESPONSEID == p.q.ID)
            .GroupJoin(context.TESTANSWERASSOCIATION, c => c.p.x.ID, b => b.TESTANSWERID, (c, b) => new { c = c, b = b })
            .SelectMany(
                n => n.b.DefaultIfEmpty(),
                    (n, b) =>
                        new QuestListItemObj
                        {
                            State = n.c.p.x.STATE,
                            Association = n.b.Select(l => l.ASSOCIATION.TITLE).ToList().Aggregate((s, t) => s + ", " + t),
                            Description = n.c.p.y.DESCRIPTION,
                            Question = n.c.p.y.QUESTION,
                            Answer = n.c.q.OPTIONTEXT,
                        }).ToList();

我也刚刚尝试了SelectMany,但遇到了同样的错误。

 Affiliaiton = n.b.SelectMany(l => l.AFFILIATION.TITLE).Aggregate(string.Empty, (s, t) => s + ", " + t),

LINQ 表达式中的聚合函数引发错误.(无法转换为商店表达式

您有一个转换为SQL的IQueryable。您的Aggregate是SQL未知的方法,因此无法翻译它,并且您会收到异常。

一种可能的方法是事先致电AsEnumerable()。这将导致查询执行并从 SQL 服务器获取数据,其余操作在内存中执行(而不是在 SQL Server 上)。

myQuery.AsEnumerable().Aggregate(...)

正如错误消息告诉您的那样,数据库不知道如何将该代码转换为 SQL。

幸运的是,它真的没有必要这样做。 与其将数据放入数据库端的逗号分隔字符串中,不如将部分下拉并在 C# 中创建一个字符串。 它提取的数据量相同,因此没有真正的理由使用数据库。

您可以使用 AsEnumerable 来确保以下操作是 linq to Object 中的操作,而不是在数据库端,但在这种情况下,Aggreagte 是用于将值附加到字符串的不良工具。 只需使用String.Join.

var query = n.b.SelectMany(l => l.AFFILIATION.TITLE);

//not very efficient option, but will work
string data1 = query.AsEnumerable().
    .Aggregate(string.Empty, (s, t) => s + ", " + t);
//faster, more efficient, simpler to write, and clearer to the reader.
string data2 = string.Join(", ", query);