2012-08-16 16 views
0

Possible Duplicate:
Explicit construction of entity type [MyClass] in query is not allowed加載一些數據使用LINQ

我使用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 - 抽象過的數據上下文,爲我提供了所有,單一(基本上得到所有的T實體)

回答

0

嘗試添加AsEnumerable在訂單條款之後,如果您沒有性能問題,則可以解決問題。

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

我認爲你必須分開里程碑對象的創建從查詢(你還設置了額外的總關閉/打開任務屬性)。在下面的查詢中,從數據庫中的匿名對象,然後*新的里程碑對象被創建。這樣,它仍然是一個單一的查詢,假設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();