何かを(GetByIdを実装するために、このメソッドを使用することができ、デフォルトはint
)。重要なことに、反射を介してAttribute
のデータを見ることの罠に陥ることはありません。 LINQツーSQLはあまりにも属性なしのオブジェクトをサポートしています。
public static TEntity Get<TEntity>(this DataContext dataContext, int id)
where TEntity : class
{
return Get<TEntity, int>(dataContext, id);
}
public static TEntity Get<TEntity, TKey>(this DataContext dataContext, TKey id)
where TEntity : class
{
// get the row from the database using the meta-model
MetaType meta = dataContext.Mapping.GetTable(typeof(TEntity)).RowType;
if (meta.IdentityMembers.Count != 1) throw new InvalidOperationException(
"Composite identity not supported");
string idName = meta.IdentityMembers[0].Member.Name;
var param = Expression.Parameter(typeof(TEntity), "row");
var lambda = Expression.Lambda<Func<TEntity, bool>>(
Expression.Equal(
Expression.PropertyOrField(param, idName),
Expression.Constant(id, typeof(TKey))), param);
return dataContext.GetTable<TEntity>().Single(lambda);
}
申し訳ありませんが、私の答えはダメだった - 私は、データベースを照会 '表'、とオブジェクトのインメモリリストを混同しました。この質問は以前に回答済みでした:http://stackoverflow.com/questions/735140/c-linq-to-sql-refectoring-this-generic-getbyid-method –