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