Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何组合2个Linq谓词-C#_Asp.net Mvc_Linq_Linq To Sql - Fatal编程技术网

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
更幸运,尽管它们本质上具有相同的含义。我想这就是编译器错误试图说的。

您可以使用谓词生成器。您可以使用谓词生成器来实现这一点。