Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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# &引用;表达式树不能包含赋值运算符“;在Select子句中使用聚合_C#_Linq_Linq To Entities_Aggregate - Fatal编程技术网

C# &引用;表达式树不能包含赋值运算符“;在Select子句中使用聚合

C# &引用;表达式树不能包含赋值运算符“;在Select子句中使用聚合,c#,linq,linq-to-entities,aggregate,C#,Linq,Linq To Entities,Aggregate,我有一些Linq到实体的代码,可以从存储中提取数据并从中创建DTO集合 List<VRTSystemOverview> systems = query.OrderBy(s => s.DHRNumber) .Select(s => new VRTSystemOverview { ID = s.ID, SystemNumber = s.SystemNumber // other properties removed for cl

我有一些Linq到实体的代码,可以从存储中提取数据并从中创建DTO集合

  List<VRTSystemOverview> systems = query.OrderBy(s => s.DHRNumber)
    .Select(s => new VRTSystemOverview {
      ID = s.ID,
      SystemNumber = s.SystemNumber
      // other properties removed for clarity...
    })
    .ToList();
List systems=query.OrderBy(s=>s.DHRNumber)
.选择(s=>new VRTSystemOverview{
ID=s.ID,
SystemNumber=s.SystemNumber
//为清晰起见,删除了其他属性。。。
})
.ToList();
查询是基于当前上下文的非枚举查询,并应用了一些筛选

现在,我想向这个DTO添加一个新属性,它是一个管道分隔的字符串,由原始系统对象上的子属性的代码组成。这将用于在客户端上进行筛选

导航的工作原理如下:每个系统都有一个产品配置,每个产品配置都有许多价目表条目,每个条目都有一个代码。因此,我想我应该能够做到以下几点

  List<VRTSystemOverview> systems = vrtSystemsBasicQuery.OrderBy(s => s.DHRNumber)
    .Select(s => new VRTSystemOverview {
      ID = s.ID,
      SystemNumber = s.SystemNumber,
      PriceBookCodes = s.ProductConfiguration
        .ProductConfigurations_PriceBook
        .Select(pb => pb.PriceBook.ProductCode)
        .Aggregate("", (s1, a) => s1 += "|" + a)
    })
    .ToList();
List systems=vrtsystembasicquery.OrderBy(s=>s.DHRNumber)
.选择(s=>new VRTSystemOverview{
ID=s.ID,
SystemNumber=s.SystemNumber,
PriceBookCodes=s.ProductConfiguration
.ProductConfigurations\u价格手册
.Select(pb=>pb.PriceBook.ProductCode)
.Aggregate(“,(s1,a)=>s1+=“|”+a)
})
.ToList();
但是,聚合方法中的第二个“s1”用红色下划线,编译器给出一个错误“表达式树可能不包含赋值运算符”

有人能解释这意味着什么,以及我是如何摆脱它的吗?我做了一些搜索,找不到问题所在。我试着阅读表达式树,但无法真正了解它们是什么,这可能是问题所在


我在这个项目的其他地方也做了同样的工作,但那是在内存中使用集合,而不是使用Linq to实体,这可能是不同之处。
.Aggregate(
行类似于:
s1=s1+“|”
。您真的想更改
s1
的值吗?如果不是,只需使用
s1+“|”+a

您的聚合不应该分配值,它应该返回总和的值:

List<VRTSystemOverview> systems = vrtSystemsBasicQuery.OrderBy(s => s.DHRNumber)
 .Select(s => new VRTSystemOverview {
   ID = s.ID,
  SystemNumber = s.SystemNumber,
  PriceBookCodes = s.ProductConfiguration
    .ProductConfigurations_PriceBook
    .Select(pb => pb.PriceBook.ProductCode)
    .Aggregate("", (s1, a) => s1 + "|" + a)
 })
.ToList();
这对于内存中的操作应该很有效

要克服运行时错误,请尝试以下操作:

List<VRTSystemOverview> systems = vrtSystemsBasicQuery.OrderBy(s => s.DHRNumber)
 .Select(s => new VRTSystemOverview {
   ID = s.ID,
   SystemNumber = s.SystemNumber,
   PriceBookCodeList = s.ProductConfiguration
    .ProductConfigurations_PriceBook
    .Select(pb => pb.PriceBook.ProductCode)
    .ToList()
 })
.AsEnumerable()
.Select(s => new {
    ID = s.ID,
    SystemNumber = s.SystemNumber,
    PriceBookCodes = string.Join("|", s.PriceBookCodeList)
});
List systems=vrtsystembasicquery.OrderBy(s=>s.DHRNumber)
.选择(s=>new VRTSystemOverview{
ID=s.ID,
SystemNumber=s.SystemNumber,
PriceBookCodeList=s.ProductConfiguration
.ProductConfigurations\u价格手册
.Select(pb=>pb.PriceBook.ProductCode)
托利斯先生()
})
.可计算的()
。选择(s=>new{
ID=s.ID,
SystemNumber=s.SystemNumber,
PriceBookCodes=string.Join(“|”,s.PriceBookCodeList)
});

这个想法是将
字符串的形式
带到内存中。

好吧,看来这是不可能的。想想看,这是有道理的,因为你不能在SQL中做等价的聚合,所以L2E不能翻译它

我在一个类似的问题中找到了帮助,特别是其中的建议(来自),创建一个包含所需数据的匿名类型,然后枚举查询,最后(当我们处理内存中的集合时,使用Linq to对象也是如此)进行聚合

这工作正常,但将查询的执行时间增加了10倍!我决定在主DTO上添加价目表代码作为子集合,这既快速又简单,然后在客户端中对集合进行筛选。这会使发送到客户端的数据稍大一些,但会降低查询执行速度


希望这对某人有所帮助。感谢回复者。

您好,感谢回复。您在这两方面都是对的,更改删除了编译器错误,并给了我一个L2E错误,因为聚合无法转换为存储表达式。看起来我必须找到另一种方法来完成此操作。还感谢关于字符串的提示。Join,这是肯定的只不过写起来比聚合容易!您好,谢谢您的回复。我原以为我想更改s1,因为我一直都是这样进行聚合的,但正如您和dasblinkenlight所指出的,删除赋值避免了编译器错误。不幸的是,它反而出现了L2E错误!无论如何,谢谢。
List<VRTSystemOverview> systems = vrtSystemsBasicQuery.OrderBy(s => s.DHRNumber)
 .Select(s => new VRTSystemOverview {
   ID = s.ID,
   SystemNumber = s.SystemNumber,
   PriceBookCodeList = s.ProductConfiguration
    .ProductConfigurations_PriceBook
    .Select(pb => pb.PriceBook.ProductCode)
    .ToList()
 })
.AsEnumerable()
.Select(s => new {
    ID = s.ID,
    SystemNumber = s.SystemNumber,
    PriceBookCodes = string.Join("|", s.PriceBookCodeList)
});