如何使用linq表作为参数?

时间:2009-09-08 11:26:46

标签: c# linq

例如一个非常简单的方法:

private int GetCount(ITable table) {

  return (from T in table select T).Count();
}

3 个答案:

答案 0 :(得分:4)

你的意思是这样的吗?

private int GetCount<T>(IQueryable<T> table) {
   // return (from T in table select T).Count();
   return table.Count();
}

顺便说一句,为什么不直接在对象上调用Count()

答案 1 :(得分:0)

重新评论:

  

private int GetCount(IQueryable table,int intID)

这是PKID吗?答案不应该是0或1吗?无论如何......你必须动态地构建Expression。像(未经测试的,based on this):

static TEntity GetCount<TEntity>(this DataContext ctx, int key) where TEntity : class
{
    return GetCount<TEntity, int>(ctx, key);
}
static TEntity GetCount<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.Count(predicate);
}

答案 2 :(得分:0)

Linq包含这个令人惊叹的IQueryable接口,它允许我们扩展查询而不实际向数据库发送任何查询。这样你就可以在你的应用程序中安全地传递你的查询,并且真正需要实际数据的每个类都发送对db的实际查询。 例如,您有一个方法可以返回所有用户的查询:

public IQueryable<User> GetAll()
{
return from user in dbContext.Users select user;
}

并且您只想获得激进的用户。您可以做的就是

foreach(var activeUser in (from user in UserRepository.GetAll() where user.Active==true select user).List())
{
//do something;
}

在上面的示例中,List()方法将导致Linq向数据库发送查询。