0

私はある種の汎用関数を作成しようとしています.コードのどこかにこれらの行があります

myDataContext dc = new myDataContext();
.
.
.(some code later)
.
Sucursal sucursal = dc.Sucursal.SingleOrDefault(s => s.Id == id);

これは素晴らしく機能します。さて、「一般的な」フォームを作成しようとすると問題が発生します

public static void FindWithId<DataBaseTable>(Table<DataBaseTable> table, int id)
    where DataBaseTable : class
{                    
   DataBaseTable t = table.SingleOrDefault(s => s.GetType().GetMember("Id").ToString() == id.ToString());
}

この行を実行すると

FindWithId<Sucursal>(dc.Sucursal,01);

次のエラーが表示されます

方法 'System.Reflection.MemberInfo[] GetMember(System.String)' は、SQL の変換を認めません。

これは大まかに次のように翻訳されます。

メソッド 'System.Reflection.MemberInfo [] GetMember (System.String)' は、SQL への変換をサポートしていません。

これを機能させるにはどうすればよいですか?

ありがとう!

ソリューションの更新

このスレッドにたどり着くまで、解決策を見つけるのに苦労していましたが、非常に徹底的な回答が得られましたが、私の目的に合わせてこれに適応させました:

  public class DBAccess
{
    public virtual DataBaseTable GetById<DataBaseTable>(int id, Table<DataBaseTable> table) where DataBaseTable : class
    {
        var itemParameter = Expression.Parameter(typeof(DataBaseTable), "item");
        var whereExpression = Expression.Lambda<Func<DataBaseTable, bool>>
            (
            Expression.Equal(
                Expression.Property(
                    itemParameter,
                    "Id"
                    ),
                Expression.Constant(id)
                ),
            new[] { itemParameter }
            );
        return table.Where(whereExpression).Single();
    }
}

それが誰かに役立つことを願っています:P

4

2 に答える 2

2

Id プロパティを取得するための汎用メソッドのみが必要な場合は、変更できます

where DataBaseTable : class

のようなものになるために

where DataBaseTable : IEntity

IEntity は、すべてのエンティティが実装できる Id プロパティを持つインターフェイスです。

エラーが発生する理由は、リフレクション メソッドを SQL に変換しようとしているためです。これは、テーブルに「メソッド」がないため、SQL では意味がありません。

于 2012-08-14T12:14:14.397 に答える
0

基本的にSQLでリフレクションメソッドを使用しようとしているため、その方法はできません。パラメーターとして渡されたものはSQLSingleOrDefault()に変換されます。

補足: s.GetType().GetMember("Id")type の値を返しますが、探していたものではありませんMemberInfoMemberInfo.ToString()

于 2012-08-14T12:17:01.423 に答える