EF投影中的计算

时间:2012-10-18 15:53:00

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

我有办法实现以下目标吗?

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

1 个答案:

答案 0 :(得分: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 DB?您是否从实体框架中保留了一些AllPrice的单独列表以及此列表中的一些AllPrice?这可能会引起混淆并导致错误。

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

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