Расчет в проекции EF
Есть ли способ, которым я могу добиться следующего?
// 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)}));
Я получаю сообщение об ошибке: сущность или сложный тип 'Portal.AllPrice' не могут быть созданы в запросе LINQ to Entities.
Кажется, EF не может обрабатывать вычисления, какие у меня есть варианты, поскольку я получаю динамическое значение из одной таблицы для расчета по другой?
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).
Поскольку кажется, что все, что вам нужно сделать, это иметь эту информацию для изменения какой-либо другой сущности, вы должны быть в состоянии сделать это с анонимным типом.
РЕДАКТИРОВАТЬ:
Вы можете добавить '.ToList()' прямо перед.Select(...). По сути, вы будете использовать LINQ TO OBJECTS вместо LINQ TO ENTITIES, поэтому, если множество сущностей может соответствовать выражению allPricesForPgs.Where(...), вам следует избегать этого.
Но если вы хотите использовать их как AllPrice, почему они не добавляются в базу данных AllPrice? Вы ведете отдельный список некоторых AllPrice из Entity Framework и некоторых AllPrice из этого списка? Это может привести к путанице и вызвать ошибки.
Последний вариант - расширить класс. Все юридические лица объявлены ЧАСТИЧНЫМИ. Вы можете создать другой класс, например:
partial class AllPrice
{
Double DiscoutedPrice { get { Price * myDiscount/100; } }