【发布时间】:2014-07-02 16:59:26
【问题描述】:
我希望能够重用我的 LINQ to Entities 查询的“选择”部分。例如,我可以采取以下...
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 使用的字段。另外,每次我需要查询项目实体时,我都可以重用 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 给出编译时错误“无法从用法推断类型参数。尝试显式指定类型参数。”
以下示例编译但在执行查询时会崩溃并显示“Internal .NET Framework Data Provider error 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));
};
有谁知道如何让内部选择工作?我明白为什么最后一个例子不起作用,但前两个接近工作了吗?
谢谢!
【问题讨论】:
标签: c# linq linq-to-entities