我正在尝试使用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中的答案表示赞赏,这就是为什么我使用交叉标记的原因)
答案 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#代码。