C# 如何使用linq表作为参数?
例如,一个非常简单的方法:C# 如何使用linq表作为参数?,c#,linq,C#,Linq,例如,一个非常简单的方法: private int GetCount(ITable table) { return (from T in table select T).Count(); } 你是说像这样的 private int GetCount<T>(IQueryable<T> table) { // return (from T in table select T).Count(); return table.Count(); } privat
private int GetCount(ITable table) {
return (from T in table select T).Count();
}
你是说像这样的
private int GetCount<T>(IQueryable<T> table) {
// return (from T in table select T).Count();
return table.Count();
}
private int GetCount(IQueryable表){
//返回(从表中的T中选择T).Count();
return table.Count();
}
顺便说一下,为什么不直接在对象上调用
Count()
?您的意思是这样的
private int GetCount<T>(IQueryable<T> table) {
// return (from T in table select T).Count();
return table.Count();
}
private int GetCount(IQueryable表){
//返回(从表中的T中选择T).Count();
return table.Count();
}
顺便说一下,为什么不直接在对象上调用Count()
私有int GetCount(IQueryable表,int intID)
那是PKID吗?答案不应该是0还是1?无论如何您必须动态地构建表达式。类似于(未经测试,):
static tenty GetCount(此DataContext ctx,int键),其中tenty:class
{
返回GetCount(ctx,键);
}
静态TEntity GetCount(此DataContext ctx,TKey键),其中TEntity:class
{
var table=ctx.GetTable();
var pkProp=(来自ctx.Mapping.GetMetaType(typeof(tenty)).DataMembers中的成员
其中member.IsPrimaryKey
选择member.member.Single();
ParameterExpression param=表达式参数(typeof(tenty),“x”);
memberExp;
开关(pkProp.MemberType)
{
case MemberTypes.Field:memberExp=Expression.Field(param,(FieldInfo)pkProp);break;
case MemberTypes.Property:memberExp=Expression.Property(param,(PropertyInfo)pkProp);break;
默认值:抛出新的NotSupportedException(“无效的主键成员:“+pkProp.Name”);
}
表达式体=表达式.Equal(
memberExp,Expression.Constant(key,typeof(TKey));
var谓词=Expression.Lambda(body,param);
返回表.计数(谓词);
}
关于您的评论:
私有int GetCount(IQueryable表,int intID)
那是PKID吗?答案不应该是0还是1?无论如何您必须动态地构建表达式。类似于(未经测试,):
static tenty GetCount(此DataContext ctx,int键),其中tenty:class
{
返回GetCount(ctx,键);
}
静态TEntity GetCount(此DataContext ctx,TKey键),其中TEntity:class
{
var table=ctx.GetTable();
var pkProp=(来自ctx.Mapping.GetMetaType(typeof(tenty)).DataMembers中的成员
其中member.IsPrimaryKey
选择member.member.Single();
ParameterExpression param=表达式参数(typeof(tenty),“x”);
memberExp;
开关(pkProp.MemberType)
{
case MemberTypes.Field:memberExp=Expression.Field(param,(FieldInfo)pkProp);break;
case MemberTypes.Property:memberExp=Expression.Property(param,(PropertyInfo)pkProp);break;
默认值:抛出新的NotSupportedException(“无效的主键成员:“+pkProp.Name”);
}
表达式体=表达式.Equal(
memberExp,Expression.Constant(key,typeof(TKey));
var谓词=Expression.Lambda(body,param);
返回表.计数(谓词);
}
Linq包含这个惊人的IQueryable接口,让我们可以扩展查询,而无需实际向数据库发送任何查询。这样,您就可以在应用程序中安全可靠地传递查询,真正需要实际数据的每个类都会将实际查询发送到数据库。
例如,您有一个返回所有用户查询的方法:
public IQueryable<User> GetAll()
{
return from user in dbContext.Users select user;
}
在上面的示例列表()中方法将导致Linq向数据库发送查询。Linq包含这个惊人的IQueryable接口,允许我们扩展查询,而无需实际向数据库发送任何查询。这样,您就可以在应用程序中安全可靠地传递查询,真正需要实际数据的每个类都会将实际查询发送到数据库。
例如,您有一个返回所有用户查询的方法:
public IQueryable<User> GetAll()
{
return from user in dbContext.Users select user;
}
在上面的示例中,List()方法将导致Linq向数据库发送查询。非常好。但是我如何使用where子句呢?private int GetCount(IQueryable table,int intID){return(从table where table.ID==intID select T.Count();}是的,这是可行的,但您可以直接使用lambda表达式:table.where(row=>row.ID==ID.Count()
@firatkuck为什么不能访问行ID?如果你不能访问它,那你就倒霉了。太好了。但是我如何使用where子句呢?private int GetCount(IQueryable table,int intID){return(从table where table.ID==intID select T.Count();}是的,这是可行的,但您可以直接使用lambda表达式:table.where(row=>row.ID==ID.Count()
@firatkuck为什么不能访问行ID?如果你不能访问它,那你就倒霉了。