0

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

// 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 无法处理计算,我有什么选择,因为我从一个表中获取动态值来对另一个表进行计算?

4

1 回答 1

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; } }
于 2012-10-18T16:15:13.983 回答