繁体   English   中英

Linq 2 SQL-通用where子句

[英]Linq 2 SQL - Generic where clause

有没有办法做到这一点

public T GetItemById(int id)
{
    Table<T> table = _db.GetTable<T>();
    table.Where(t => t.Id == id);
}

请注意,i.Id在上下文中不存在,因为linq不知道它正在使用的对象,而Id是表的主键

(删除了绑定到属性的方法)

编辑:这是元模型的方式(因此它适用于映射文件以及属性对象):

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);
}

您需要创建一个从中派生实体的适当接口(除非您想使用像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();
}

也许您可以在http://www.albahari.com/nutshell/predicatebuilder.aspx的“通用谓词”下找到某些内容。 这是页面的最后一部分。

var X = _db.table.Select(i => i.Id == id);

这将返回IQueryable <T>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM