我正在尝试使用实体框架 6 创建动态投影,但到目前为止我失败了。根据某些条件,我想在投影结果中包含或排除某些数据。
以下是有效的方法:
Dim carQueryable = currentContext.Car.Include("ModellVariant.Modell.Make")
if (includeEquipment) then
return carQueryable.
Select(Function(car) New CarFlatRecord With{
.Fahrzeug = car,
.ModellVariant = car.ModellVariant,
.Modell = car.ModellVariant.Modell,
.Make = car.ModellVariant.Modell.Make,
.Equipment = car.Equiptment
} )
ELSE
return carQueryable.
Select(Function(car) New CarFlatRecord With{
.Fahrzeug = car,
.ModellVariant = car.ModellVariant,
.Modell = car.ModellVariant.Modell,
.Make = car.ModellVariant.Modell.Make} )
END IF
我的问题是我已经有三个类似于包含设备的二进制条件。因此,简单的 if/then 解决方案已经需要 8 条不同的路径。我将表达式视为解决方案,但似乎 EF 无法处理任何复杂的场景。
我尝试在 with-子句中使用 if()
,这确实产生了正确填充的输出,但在 SQL 中,表仍然被连接(这是我想要避免的主要关注点(。
(感谢 c# 和 vb 中的答案,这就是我交叉标记的原因(
当谈到实体框架的动态时,通常有 2 个简单的解决方案(一个免费,一个付费(。
对于这两种解决方案,都需要生成一个包含动态投影的字符串。
自由
LINQ 动态:https://github.com/kahanu/System.Linq.Dynamic/wiki/Dynamic-Expressions
一个非常流行的库,可以轻松处理这种情况
var list = context.Customers.Select("new(Name, IsActive)").ToList();
如果您想处理最基本的场景,我推荐这个库
支付
免责声明:我是该项目的所有者 Eval-Expression.NET
通过使用表达式树,此库的功能更强大。它支持与 C# 完全相同的语法
var list = context.Customers.SelectDynamic(x => "new { x.Name, x.IsActive }").ToList();
此库可用于更复杂的方案。它允许您在运行时编译和执行动态 C# 代码。