【发布时间】:2014-10-22 12:14:23
【问题描述】:
我们的项目中有很多 Dto 类,并且在各种情况下使用实体框架上下文中的表达式来选择它们。这样做的好处是 EF 可以解析我们的请求,并从中构建一个不错的 SQL 语句。
不幸的是,这导致了非常大的表达式,因为我们无法组合它们。
因此,如果您有一个具有 3 个属性的 DtoA 类,其中一个是具有 5 个属性的 DtoB 类,而其中一个是具有 10 个属性的 DtoC 类,您将不得不编写一个大选择器。
public static Expression<Func<ClassA, DtoA>> ToDto =
from => new DtoA
{
Id = from.Id,
Name = from.Name,
Size = from.Size,
MyB = new DtoB
{
Id = from.MyB.Id,
...
MyCList = from.MyCList.Select(myC => new DtoC
{
Id = myC.Id,
...
}
}
};
此外,它们不能重复使用。当你有 DtoD 时,它也具有类 DtoB 的属性,你将不得不再次粘贴所需的 DtoB 和 DtoC 代码。
public static Expression<Func<ClassD, DtoD>> ToDto =
from => new DtoD
{
Id = from.Id,
Length = from.Length,
MyB = new DtoB
{
Id = from.MyB.Id,
...
MyCList = from.MyCList.Select(myC => new DtoC
{
Id = myC.Id,
...
}
}
};
所以这将很快升级。请注意,上述代码只是一个示例,但您明白了。
我想为每个类定义一个表达式,然后根据需要将它们组合起来,并且 EF 仍然能够解析它并生成 SQL 语句,以免失去性能改进。
我怎样才能做到这一点?
【问题讨论】:
-
你的类和 dtos 有什么抽象吗?也许您可以实现一个通用方法来创建表达式。
-
你需要什么抽象?对于此示例,可以安全地假设 dto 和 class 是相同的。我不确定我将如何实现通用方法。我不想失去 EF 解析表达式并基于它构建 sql 表达式的能力。
标签: linq lambda entity-framework-6