我希望能够重用我的LINQ to Entities查询中的"select"部分。例如,我可以采取以下措施...
projectQuery.Select(p => new ProjectModel
ProjectName = p.ProjectName,
ProjectNumber = p.ProjectNumber);
并将其替换为表达式...
projectQuery.Select(ProjectModel.FullSelector);
FullSelector的格式如下:
public static System.Linq.Expressions.Expression<Func<Project, ProjectModel>> FullSelector = project => new ProjectModel
{
ProjectName = p.ProjectName,
ProjectNumber = p.ProjectNumber
};
这个很好用,而且发送给数据库的查询只选择FullSelector使用的字段。此外,每次需要查询Project实体时,可以重复使用FullSelector。
现在是棘手的部分。当执行包含导航属性的查询时,嵌套的选择器表达式不起作用。
public static System.Linq.Expressions.Expression<Func<Project, ProjectModel>> FullSelector = project => new ProjectModel
{
ProjectName = p.ProjectName,
ProjectNumber = p.ProjectNumber
Addresses = p.Addresses.Select(AddressModel.FullSelector);
};
这没用。内部的Select会给出编译时错误 "The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly."
以下示例编译通过,但在执行查询时崩溃,显示 "Internal .NET Framework 数据提供程序错误 1025.":
public static System.Linq.Expressions.Expression<Func<Project, ProjectModel>> FullSelector = project => new ProjectModel
{
ProjectName = p.ProjectName,
ProjectNumber = p.ProjectNumber
Addresses = p.Addresses.Select(AddressModel.FullSelector.Compile());
};
下一个示例编译通过,但会抛出运行时错误“LINQ to Entities 不认可 'EPIC.WebAPI.Models.AddressModel Invoke(EPIC.Domain.Entities.Address)' 方法,并且该方法无法转换为存储表达式。”public static System.Linq.Expressions.Expression<Func<Project, ProjectModel>> FullSelector = project => new ProjectModel
{
ProjectName = p.ProjectName,
ProjectNumber = p.ProjectNumber
Addresses = p.Addresses.Select(a => AddressModel.PartialSelector.Compile().Invoke(a));
};
有人知道如何使内部选择器工作吗?我理解最后一个示例为什么不起作用,但前两个示例是否接近实现目标呢?
谢谢!
Use
方法,该方法接受两个选择器并将它们都传递给最后一个选择器。我已经在问题中编辑了这样的重载。如果你需要为三个、四个等选择器创建一个方法,希望你能看到模式。 - Servy