4

私は次のクラスを持っています:

public class BicycleSellerListing : IUserName
{
    public UserProfile UserProfile { get; set; }

    /// <summary>
    /// IUserName interface property
    /// </summary>
    public string UserName
    {
        get
        {
            return UserProfile.UserName;
        }
    }
}

インターフェース:

public interface IUserName
{
    string UserName { get; }
}

そして、このクエリ:

public static List<T> GetList<T>(string userName) where T : class, IUserName
{
    using (SqlUnitOfWork work = new SqlUnitOfWork())
    {
        return work.GetList<T>(row => row.UserName == userName)
            .ToList();
    }
}

このクエリを実行すると、次の例外が発生します。

指定された型メンバー 'UserName' は、LINQ to Entities ではサポートされていません。初期化子、エンティティ メンバー、およびエンティティ ナビゲーション プロパティのみがサポートされています。

例外が発生する理由は理解していますが、インターフェイスを使用してこのクエリを実行できる方法があるかどうか疑問に思っていますか?

4

3 に答える 3

2

あなたの質問に答えるには:

Is it possible to query on an interface property?

はい。問題ありません。発生している障害は、インターフェイスが原因ではありません。

問題は、Linq 2 エンティティでマップされていないプロパティに対してクエリを実行できないことです。

他の人もこの問題を抱えています。

基になる式ビルダーは、データベースにマップされているプロパティとそうでないプロパティを区別できません。

コンパイラがあなたを助けることができないので、それは問題です。オブジェクトへのLinqでは問題ないため、コンパイラはエラー/警告をスローしません

このプロパティがマップされていないことを明確にするようにしてください。おそらく、プレフィックス、またはすべての「カスタム」プロパティを含むネストされたクラスによってです。

于 2013-03-15T12:07:08.850 に答える
0

既存の回答に加えて、メモリ内のwhereを実行できますが、これはテーブル全体を取得することを意味します。

通常、これはお勧めしません。

public static List<T> GetList<T>(string userName) where T : class, IUserName
{
    using (SqlUnitOfWork work = new SqlUnitOfWork())
    {
        return work.GetList<T>()
            .AsEnumerable()
            .Where(row => row.UserName == userName)
            .ToList();
    }
}
于 2013-03-15T12:13:58.013 に答える
0

いくつかの回避策:

  • 実行時に基になるエンティティ タイプを決定してから
    、このタイプでクエリを実行するジェネリック メソッドを動的にコンパイルして呼び出すことができます。

  • Expression クラスを使用して、実行時にこのクエリを手動で組み立てることができます。

  • Linq の代わりに Entity SQL クエリ構文を試すことができます

于 2013-03-15T14:30:58.527 に答える