【问题标题】:Load some data for props using linq [duplicate]使用 linq 为道具加载一些数据 [重复]
【发布时间】:2012-08-16 10:02:19
【问题描述】:

可能重复:
Explicit construction of entity type [MyClass] in query is not allowed

我正在使用 linq to sql - 我正在尝试获取以下 2 个道具的计数(打开和关闭任务)但是我收到一个异常,说我无法在查询中加载实体,我该如何实现?

我的代码:

var milestones = ReadOnlySession.All<Milestone>()
    .Where(x => x.InstructionID == instructionid)
    .OrderBy(x => x.Name)
    .Select(x => new Milestone
    {
        Name = x.Name,
        InstructionID = x.InstructionID,
        Body = x.Body,
        Deadline = x.Deadline,
        MilestoneID = x.MilestoneID,
        TotalClosedTasks = 
            ReadOnlySession.All<InstructionTask>()
            .Count(c => c.Milestone == x.MilestoneID && !c.IsOpen),
        TotalOpenTasks = 
            ReadOnlySession.All<InstructionTask>()
            .Count(c => c.Milestone == x.MilestoneID && c.IsOpen)
    })
    .ToList();

错误:

消息:不允许在查询中显式构造实体类型“Surventrix.Domain.Model.Entities.Milestone”。

来源:System.Data.Linq

注意: ReadOnlySession - 对数据上下文的抽象,为我提供 All、Single(基本上获取 T 的所有实体)

【问题讨论】:

    标签: c# .net linq linq-to-sql


    【解决方案1】:

    尝试在 order 子句后添加 AsEnumerable,如果您没有性能问题,这应该可以解决问题。

    var milestones = ReadOnlySession.All<Milestone>()
    .Where(x => x.InstructionID == instructionid)
    .OrderBy(x => x.Name).AsEnumerable()
    .Select(x => new Milestone
    {
    

    【讨论】:

      【解决方案2】:

      我认为您必须将 Milestone 对象的创建(您还设置额外的总关闭/打开任务属性)与查询分开。在下面的查询中,来自数据库的匿名对象,然后*新的 Milestone 对象被创建。这样,它仍然是单个查询,假设 ReadOnlySession 仍然返回 IQueryable。

      var milestones = ReadOnlySession.All<Milestone>()
          .Where(x => x.InstructionID == instructionid)
          .OrderBy(x => x.Name)
          .Select(x => new { 
              Milestone = x,
              TotalClosedTasks = ReadOnlySession.All<InstructionTask>()
                                      .Count(c => c.Milestone == x.MilestoneID && !c.IsOpen)
              TotalOpenTasks = ReadOnlySession.All<InstructionTask>()
                                      .Count(c => c.Milestone == x.MilestoneID && c.IsOpen)
          })
          .AsEnumerable()
          .Select(x => new Milestone {
              Name = x.Milestone.Name,
              InstructionID = x.Milestone.InstructionID,
              Body = x.Milestone.Body,
              Deadline = x.Milestone.Deadline,
              MilestoneID = x.Milestone.MilestoneID,
              TotalClosedTasks = x.TotalClosedTasks,
              TotalOpenTasks = x.TotalOpenTask
          })
          .ToList();
      

      【讨论】:

        猜你喜欢
        • 2020-01-09
        • 1970-01-01
        • 2021-09-01
        • 2021-03-19
        • 2010-10-19
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多