例如一个非常简单的方法:
private int GetCount(ITable table) {
return (from T in table select T).Count();
}
答案 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向数据库发送查询。