C# &引用;表达式树不能包含赋值运算符“;在Select子句中使用聚合
我有一些Linq到实体的代码,可以从存储中提取数据并从中创建DTO集合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
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)
});