Asp.net mvc 如何组合2个Linq谓词-C#
我有以下功能Asp.net mvc 如何组合2个Linq谓词-C#,asp.net-mvc,linq,linq-to-sql,Asp.net Mvc,Linq,Linq To Sql,我有以下功能 public virtual ICollection<T> initData<T>(System.Data.Entity.DbSet<T> set, System.Linq.Expressions.Expression<Func<T, bool>> filter) where T : CModel<T> { var x = (from dc in set select d
public virtual ICollection<T> initData<T>(System.Data.Entity.DbSet<T> set, System.Linq.Expressions.Expression<Func<T, bool>> filter) where T : CModel<T>
{
var x = (from dc in set select dc);
if (!this.db.valid)
{
System.Linq.Expressions.Expression<Func<T, bool>> active = a => a.active;
filter = (Expression<Func<T, bool>>)Expression.Lambda(Expression.AndAlso(filter, active));
x.Where(filter);
}
else
{
x.Where(filter);
}
return (ICollection<T>)x.ToList();
}
我怎样才能把这两个条件结合起来呢?我想你让自己的生活很艰难。您可以多次使用Where扩展方法,如下所示:
public virtual ICollection<T> initData<T>(System.Data.Entity.DbSet<T> set, System.Linq.Expressions.Expression<Func<T, bool>> filter) where T : CModel<T>
{
var x = (from dc in set select dc);
x = set.Where(filter);
if (!this.db.valid)
{
x = x.Where(a => a.active);
}
return x.ToList();
}
公共虚拟ICollection initData(System.Data.Entity.DbSet,System.Linq.Expressions.Expression filter),其中T:CModel
{
var x=(从集合中的dc选择dc);
x=设置。其中(过滤器);
如果(!this.db.valid)
{
x=x,其中(a=>a.active);
}
返回x.ToList();
}
请注意,在代码中使用了x.Where(filter)代码>
这是没有用的,因为Where不改变x,所以结果基本上被丢弃。
要保留结果,您需要将其分配给某个对象:
x=x.Where(过滤器)代码>
这与处理字符串时的想法相同
第二个答案:
有一个内置的委托称为谓词
。我认为使用这种类型可能比使用Func
更幸运,尽管它们本质上具有相同的含义。我想这就是编译器错误想要说的。我想你让自己的生活很艰难。您可以多次使用Where扩展方法,如下所示:
public virtual ICollection<T> initData<T>(System.Data.Entity.DbSet<T> set, System.Linq.Expressions.Expression<Func<T, bool>> filter) where T : CModel<T>
{
var x = (from dc in set select dc);
x = set.Where(filter);
if (!this.db.valid)
{
x = x.Where(a => a.active);
}
return x.ToList();
}
公共虚拟ICollection initData(System.Data.Entity.DbSet,System.Linq.Expressions.Expression filter),其中T:CModel
{
var x=(从集合中的dc选择dc);
x=设置。其中(过滤器);
如果(!this.db.valid)
{
x=x,其中(a=>a.active);
}
返回x.ToList();
}
请注意,在代码中使用了x.Where(filter)代码>
这是没有用的,因为Where不改变x,所以结果基本上被丢弃。
要保留结果,您需要将其分配给某个对象:
x=x.Where(过滤器)代码>
这与处理字符串时的想法相同
第二个答案:
有一个内置的委托称为谓词
。我认为使用这种类型可能比使用Func
更幸运,尽管它们本质上具有相同的含义。我想这就是编译器错误试图说的。您可以使用谓词生成器。您可以使用谓词生成器来实现这一点。