【问题标题】:LINQ project() to automap from data entity to business entity within LINQ IQueryable?LINQ project() 在 LINQ IQueryable 中从数据实体自动映射到业务实体?
【发布时间】:2015-12-18 15:51:40
【问题描述】:

我不确定这是否可能。

一些要求

  • 我们的查询自始至终都是 IQueryable。
  • 通过 OData 传递的所有参数
  • Entities 和 Business Entities 是分开的 我们的查询应该只
  • 返回业务实体,而不是数据实体

这就是我们正在尝试做的事情

var query = from mpg in this.markingPeriodGroupRepository.GetAll()
            join mp in this.markingPeriodRepository.GetAll().Include(x => x.SchoolMarkingPeriods) 
                on mpg.MarkingPeriodGroupID equals mp.MarkingPeriodGroupID
            select new MarkingPeriodTerm
            {
                MarkingPeriodGroupID = mpg.MarkingPeriodGroupID,
                MarkingPeriodGroupName = mpg.MarkingPeriodGroupName,
                SchoolMarkingPeriods = mp.SchoolMarkingPeriods.AsQueryable()
                    .Project().To<SchoolMarkingPeriod>(null).ToList()
            };

在运行时,我们得到这个错误:

LINQ to Entities 无法识别方法 'System.Linq.IQueryable1[NHA.App.Core.v2.Business.Models.SchoolMarkingPeriod] To[SchoolMarkingPeriod](System.Collections.Generic.IDictionary2[System.String,System.Object])' 方法,并且此方法无法转换为存储表达式。

是否可以在此 IQueryable 中自动映射此属性?

【问题讨论】:

  • 问题不是很清楚。什么是 OData 和数据?您还可以提供实体的代码吗?具体来说,mp.SchoolMarkingPeriods的定义是什么?
  • 我正在尝试找到一种方法来更清晰地构建我的问题。嗯...基本上,我不想在 AutoMapper 中使用 .Project() 来尝试将其转换为 SQL,而是延迟执行我正在尝试做的事情。
  • 您最好的选择是自己构建选择器表达式。从技术上讲,它是一个带有成员 init 的NewExpression,我怀疑To 方法不能转换为可翻译的表达式无论如何,这意味着您仍然必须使用另一个@987654325 @ 为 SchoolMarkingPeriod 自己投射(初始化成员 SchoolMarkingPeriods。这很复杂,但它是满足您要求的唯一方法。

标签: c# entity-framework linq automapper iqueryable


【解决方案1】:

在您的查询中,选择一个匿名类型并且不要执行 Project 方法。

var query = from mpg in this.markingPeriodGroupRepository.GetAll()
            join mp in this.markingPeriodRepository.GetAll().Include(x => x.SchoolMarkingPeriods)
                on mpg.MarkingPeriodGroupID equals mp.MarkingPeriodGroupID
            select new //Here we are selecting an anonymous type
            {
                MarkingPeriodGroupID = mpg.MarkingPeriodGroupID,
                MarkingPeriodGroupName = mpg.MarkingPeriodGroupName,
                SchoolMarkingPeriods = mp.SchoolMarkingPeriods   
            };

那么,在执行完查询之后,我们就可以使用Project方法了。

var result = query
    .ToList() //This will actually execute the query.
    .Select(x => new MarkingPeriodTerm()
    {
        MarkingPeriodGroupID = x.MarkingPeriodGroupID,
        MarkingPeriodGroupName = x.MarkingPeriodGroupName,
        SchoolMarkingPeriods = x.SchoolMarkingPeriods.Project().To<SchoolMarkingPeriod>(null).ToList() //Here we are executing the Project method on in-memory data
    });

【讨论】:

  • 嗯..是的,我玩过那个,但是我的 IQueryable 当然坏了。
  • 怎么破的?你能解释一下吗?
  • 在主查询上执行 .ToList 后,它不再是 IQueryable (.ToList() //这将实际执行查询。)。这将执行我的查询,但没有传入我的 OData 参数。
  • 让我试试这个。
  • 请更新您的问题以包含有关这些 OData 参数的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 2011-05-06
相关资源
最近更新 更多