EF6中的动态预测

时间:2019-06-17 19:55:45

标签: .net vb.net entity-framework

我正在尝试使用Entity Framework 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

我的问题是我已经有三个类似于includeEquipment的二进制条件。因此,简单的if / then解决方案已经需要8条不同的路径。我以表达式作为解决方案,但似乎EF无法处理任何复杂的情况。

我尝试在附带条款中使用if(),但这确实会产生正确填充的输出,但是在SQL中,表仍然是联接的(这是我要避免的主要问题)。

(对c#和vb中的答案表示赞赏,这就是为什么我使用交叉标记的原因)

1 个答案:

答案 0 :(得分:1)

当谈到实体框架的动态性时,通常有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#代码。