EF6 中的动态投影



我正在尝试使用实体框架 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# 代码。

最新更新