有没有办法做到这一点
public T GetItemById(int id)
{
Table<T> table = _db.GetTable<T>();
table.Where(t => t.Id == id);
}
注意i.Id在上下文中不存在,因为linq不知道它正在使用什么对象,而Id是表的主键
答案 0 :(得分:4)
(已移除的属性绑定方法)
编辑:这里是元模型方式(所以它适用于映射文件和属性对象):
static TEntity Get<TEntity>(this DataContext ctx, int key) where TEntity : class
{
return Get<TEntity, int>(ctx, key);
}
static TEntity Get<TEntity, TKey>(this DataContext ctx, TKey key) where TEntity : class
{
var table = ctx.GetTable<TEntity>();
var pkProp = (from member in ctx.Mapping.GetMetaType(typeof(TEntity)).DataMembers
where member.IsPrimaryKey
select member.Member).Single();
ParameterExpression param = Expression.Parameter(typeof(TEntity), "x");
MemberExpression memberExp;
switch (pkProp.MemberType)
{
case MemberTypes.Field: memberExp = Expression.Field(param, (FieldInfo)pkProp); break;
case MemberTypes.Property: memberExp = Expression.Property(param, (PropertyInfo)pkProp); break;
default: throw new NotSupportedException("Invalid primary key member: " + pkProp.Name);
}
Expression body = Expression.Equal(
memberExp, Expression.Constant(key, typeof(TKey)));
var predicate = Expression.Lambda<Func<TEntity, bool>>(body, param);
return table.Single(predicate);
}
答案 1 :(得分:2)
你需要创建一个适当的接口,实体派生出来(除非你想用像Marc这样的表达式树来做):
public interface IIdentifiedEntity
{
int Id { get; } // Set as well? Depends on your situation.
}
然后你可以写:
public T GetItemById<T>(int id) where T : class, IIdentifiedEntity
{
Table<T> table = _db.GetTable<T>();
return table.Where(t => t.Id == id)
.Single();
}
答案 2 :(得分:0)
也许你可以在http://www.albahari.com/nutshell/predicatebuilder.aspx的Generic Predicates下找到一些东西。这是页面的最后一部分。
答案 3 :(得分:0)
var X = _db.table.Select(i => i.Id == id);
这将返回IQueryable&lt; T&GT;