【问题标题】:Calculation in EF ProjectionEF 投影中的计算
【发布时间】:2012-10-18 15:53:00
【问题描述】:

有没有办法实现以下目标?

// colourInfo.Discount = 75, but can change
// allPrice type has Part, Desc, Type

var a = allPricesForPgs.Where(x => x.PG == c && x.ColourCode == colourInfo.ColourCode).Select(y=> new AllPrice {Part=y.Part, Desc=y.Desc, Price=y.Price*(colourInfo.Discount/100)}));

我收到错误:无法在 LINQ to Entities 查询中构造实体或复杂类型“Portal.AllPrice”。

似乎 EF 无法处理计算,我有什么选择,因为我从一个表中获取动态值来对另一个表进行计算?

【问题讨论】:

标签: c# sql-server entity-framework lambda projection


【解决方案1】:

Sam1 的评论是正确的。你不能投射到另一个实体。您还有其他选择可以像这样创建匿名类型:

var a = allPricesForPgs
        .Where(x => x.PG == c && x.ColourCode == colourInfo.ColourCode)
        .Select(y=> new 
            {
                Part=y.Part, 
                Desc=y.Desc, 
                Price=y.Price*(colourInfo.Discount/100)
             }
         ));

或者创建一个类来保存临时数据(例如 DTO)。

由于您似乎只需要拥有这些信息来修改其他实体,因此您应该能够使用匿名类型来完成。

编辑:

您可以在 .Select(...) 之前添加一个“.ToList()”。您实际上是在使用 LINQ TO OBJECTS 而不是 LINQ TO ENTITIES,所以如果很多实体可能与 allPricesForPgs.Where(...) 语句匹配,您应该远离它。

但是,如果您想将这些作为 AllPrice 的,为什么不将它们添加到 AllPrice 数据库中?您是否保留了来自 Entity Framework 的一些 AllPrice 的单独列表和来自该列表的一些 AllPrice 的单独列表?这可能会令人困惑并导致错误。

最后一个选择是扩展类。所有实体都被声明为 PARTIAL。您可以创建另一个类,例如:

partial class AllPrice
{
    Double DiscoutedPrice { get { Price * myDiscount/100; } }

【讨论】:

  • 匿名类型的唯一问题是我正在构建一个 AllPrice 类型的累积列表,我有时会在其中添加干净的 AllPrice 类型,然后有时我会添加我修改价格的类型,因为现在他们很快我就无法将两者合并到 List... 这会造成痛苦。
  • 我已经编辑了我的答案,但从表面上看,这听起来是个坏主意。 AllPrice 实体的列表应仅反映数据库中的内容。如果您要创建其他临时数据列表,则应将 AllPrice 和其他类型都转换为第三类类型。
  • 嗯,我重读了你的问题,你想要的只是稍微修改过的 AllPrice。我已经重新编辑了我的答案,希望能有所帮助!
猜你喜欢
  • 2012-12-07
  • 2022-12-08
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 2021-06-08
  • 2013-06-22
  • 2018-05-04
  • 1970-01-01
相关资源
最近更新 更多