gpt4 book ai didi

c# - LINQ to Entities 尝试投影两个表并将它们聚合

转载 作者:搜寻专家 更新时间:2023-10-30 23:28:37 25 4
gpt4 key购买 nike

我有两个表:Properties,Rentals

它具有几个相似的属性,例如:AreaInSquareMeters、RentalPrice 等。我有 DTO,我想将它们转换到其中,然后将它们合并为一个整体。但是,如果我将集合映射到 DTO,则会引发异常:

The 'Distinct' operation cannot be applied to the collection ResultType of the specified argument.Parameter name: argument

这是引发异常的小代码

var properties = Context.Properties.Select(property => new PropertyInfoDTO
{
Id = property.Id,
PropertyName = property.PropertyName,
SellingPrice = property.SellingPrice,
RentalPrice = property.RentalPrice,
Images = property.Images.Select(image => new PropertyImagesInfoDTO
{
ImagePath = image.ImagePath,
ImageRatio = image.ImageRatio
}).ToList(),
other properties mapped here
}

然后:

var rentals = Context.Properties.Select(property => new PropertyInfoDTO
{
Id = property.Id,
PropertyName = property.Property.PropertyName,
SellingPrice = property.Property.SellingPrice,
RentalPrice = property.RentalPrice,
Images = property.Property.Images.Select(image => new PropertyImagesInfoDTO
{
ImagePath = image.ImagePath,
ImageRatio = image.ImageRatio
}).ToList(),
other properties mapped here
}

我想做一个整体:

properties = properties.Union(rentals);

一切正常,直到我查询数据库并尝试实现查询关于如何同时转换为某些 DTO 和聚合它们的任何建议?

最佳答案

Union 是隐含的 Distinct。当对象具有集合成员时,没有简单的方法来确定不同的对象。这就是异常试图表达的意思。

但是,看到您的 PropertyInfoDTO 类,您可能并不打算让集合与众不同。 PropertyInfoDTO 的结构要求您使用 Concat,它只是简单地组合两个集合,没有隐式的 Distinct

但是,在 EF6 中,如果您这样做...

properties = properties.Concat(rentals);

...你会得到一个 EntityCommandCompilationException

The nested query is not supported. Operation1='UnionAll' Operation2='MultiStreamNest'

...这意味着 EF 未能成功将查询表达式转换为一条 SQL 语句。在 EF-core 中,你也会得到一个异常,但是一个不同的异常。

除了强制两个查询分别运行之外,没有其他方法可以解决这些异常:

var properties = Context.Properties.Select(...)
.AsEnumerable();
properties = properties.Concat(rentals);

关于c# - LINQ to Entities 尝试投影两个表并将它们聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52654673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com