2

最近データベースをアップグレードしていて、このエラーが発生しました

基本的に私がやったことは次のとおりです。

、、、...を持つテーブルがありました。これをテーブルとテーブルにリファクタリングしParticipantsました。それぞれがUUID 経由でリンクされています。テーブルからとを削除したので、テーブルに表示されます。NameFirst NameE-mail addressPersonsParticipantsparticipantpersonNameFirst NameparticipantsPersons

私の参加者の部分クラスでは:

public partial class Participant {
    public string Name {
        get {
            return this.Person.Name;
        }
    }

    public string FirstName {
        get {
            return this.Person.FirstName;
        }
    }

}

そのため、プロジェクト全体で名前を見つけることができ、一度に多くのコードを編集する必要はありません。

ただし、次のクエリで問題が発生しました。

      _db.Participants.Where(q => whatever).OrderBy(q => q.Name).ThenBy(q => q.FirstName).ToList();

これは悪名高いThe member 'xxx.Models.Participants.Name' has no supported translation to SQL

Participants.NameSQLジェネレーターに実際にあることを簡単に伝える方法はありますParticipants.Person.Nameか?

4

2 に答える 2

2

免責事項: 以前に作成したクエリを変更せずに使用できるようにするためにこれを行っている場合は、残念ながら運が悪いです。ただし、カプセル化とコード管理のためにこれを行っている場合は、読み進めてください。


方法はありますが、少し面倒です。

まず、クラスに式を追加する必要がありますParticipant(LINQ と EF は、コンパイル済みのコードではなく式を処理するため)。

public partial class Participant
{
    public static readonly Expression<Func<Participant, string>>
        NameExpression = p => p.Person.Name;

    public static readonly Expression<Func<Participant, string>>
        FirstNameExpression = p => p.Person.FirstName;

プロパティは、現在書かれている方法で引き続き使用できます。

    [NotMapped]
    public string Name
    {
        get
        {
            return this.Person.Name;
        }
    }

または、コードの繰り返しを減らすために、静的式を参照できます。

    [NotMapped]
    public string FirstName
    {
        get
        {
            return Participant.FirstNameExpression.Compile().Invoke(this);
            // if you do this, you might want to consider caching the delegate
            // returned by Expression.Compile()
        }
    }
}

最後に、LINQ クエリを作成するときは、ラムダ構文を使用する必要がありますが、クエリに直接記述されたアドホック式の代わりに、作成した式を使用できます。

IEnumerable<Participant> participants = _db.Participants
//  .Where(q => whatever)
    .OrderBy(Participant.NameExpression)
    .ThenBy(Participant.FirstNameExpression)
    .ToList();
于 2013-03-05T07:32:22.397 に答える
1

とにかくクエリを編集する必要がある場合は、拡張機能をそのまま使用することもできます。

public static class MyExtensions {
    public static IQueryable<Participant> InDefaultOrder(this IQueryable<Participant> source) {
        return source.OrderBy(q => q.Person.Name).ThenBy(q => q.Person.FirstName);
    } 
}

次に、私のクエリは次のようになります。_db.Participants.Where(q => whatever).InDefaultOrder().ToList();

変更があったとしても、編集と保守は簡単です。

- - 編集 - -

これも追加する必要がありました

public static class MyExtensions {
    public static IEnumerable<Participant> InDefaultOrder(this IEnumerable<Participant> source) {
        return source.OrderBy(q => q.Person.Name).ThenBy(q => q.Person.FirstName);
    } 
}
于 2013-03-05T08:29:00.577 に答える