0

重複の可能性:
クエリでのエンティティ タイプ [MyClass] の明示的な構築は許可されていません

私は 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 のすべてのエンティティを取得します)。

4

2 に答える 2

0

パフォーマンスの問題がない場合は、注文句の後に AsEnumerable を追加してみてください。これで問題が解決するはずです。

var milestones = ReadOnlySession.All<Milestone>()
.Where(x => x.InstructionID == instructionid)
.OrderBy(x => x.Name).AsEnumerable()
.Select(x => new Milestone
{
于 2012-08-16T10:12:29.310 に答える
0

Milestone オブジェクトの作成 (追加のクローズ済み/オープン タスクの合計プロパティも設定する場所) をクエリから分離する必要があると思います。以下のクエリでは、db からの匿名オブジェクトと、その後* 新しい 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();
于 2012-08-16T10:14:44.720 に答える