我有办法实现以下目标吗?
// 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无法处理计算,我有什么选择,因为我从一个表中获取动态值来对另一个表进行计算?
答案 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; } }