4

Linq を使用して、リポジトリから選択したデータを変換しようとしています。

これまでの私のコード:

Repository<Result> _repository = new Repository<Result>();

var disciplines = _repository.Query()
    .Select(d => new Discipline
    {
        DisciplineCode = d.DisciplineCode,
        Name = d.DisciplineName
    })
    .Distinct()
    .ToList();

結果クラスは次のようになります。

public class Result
{
    public virtual int ResultId { get; set; }
    public virtual string DisciplineCode { get; set; }
    public virtual string DisciplineName { get; set; }
    public virtual int CompetitorId { get; set; }
    //other stuff
}

これが実行されると、私は得る

式のシリアル化情報を特定できません: < MemberInitExpression >

何がうまくいかないのですか?

編集:

Chris の提案に従って、次のように ToList の後に Select を試しました。

var disciplines = _repository.Query()
                .Select(d => new
                {
                    DisciplineCode = d.DisciplineCode,
                    Name = d.DisciplineName
                })
                .Distinct()
                .ToList()
                .Select(d => new Discipline { DisciplineCode = d.DisciplineCode, Name = d.Name });

ただし、今回も同様のエラーですが、匿名型に関係しています。

式のシリアル化情報を特定できません: new __AnonymousType(d.DisciplineCode, d.DisciplineName)。

編集2:

明確にするために、.Query は IQueryable を返し
ます 基礎となるデータベースは MongoDB です (C# ドライバーを使用)

私がこれを行う場合:

var disciplines = _repository.Query()
    .Select(d => d.DisciplineName)
    .Distinct()
    .ToList()

できます。distinctつまり、DisciplineNamesのリストを取得します。

ただし、名前だけでなく、より多くのプロパティを選択できる必要があります。

4

2 に答える 2

6

あなたの問題は、MongoDB ドライバーがDisciplineオブジェクト (または匿名オブジェクト) を作成する方法を知らないことだと思います。

IQueryable<>これを機能させるには、から移動する必要がありますIEnumerable<>

これを試して:

var disciplines =
    _repository
        .Query()
        .ToArray()
        .Select(d => new Discipline
            {
                DisciplineCode = d.DisciplineCode,
                Name = d.DisciplineName
            })
        .Distinct()
        .ToList();

これ.ToArray()が魔法です。これがうまくいくかどうか教えてください。

カスタム タイプで動作する呼び出しにまだ問題がある.Distinct()可能性があるため、これを試す必要がある場合があります。

var disciplines =
    _repository
        .Query()
        .ToArray()
        .Select(d => new
            {
                d.DisciplineCode,
                d.DisciplineName
            })
        .Distinct()
        .Select(d => new Discipline
            {
                DisciplineCode = d.DisciplineCode,
                Name = d.DisciplineName
            })
        .ToList();
于 2012-07-08T02:20:35.130 に答える
0

最初の例が実行されない理由がわからない場合は、問題ないように見えます。ここで関連する質問を参照してください。おそらく、db ドライバーのバグでしょうか?

GroupBy を使用して同じ結果を得ることができます。

    var disciplines = _repository.Query()     
    .GroupBy(d => new Discipline     
        {         
             DisciplineCode = d.DisciplineCode,         
             Name = d.DisciplineName     
        }
    ) 
    .ToList();
于 2012-07-07T23:36:18.323 に答える