Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/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
C# 应用PredicateBuilder查询项目列表的单个对象属性_C#_Linq_Predicatebuilder - Fatal编程技术网

C# 应用PredicateBuilder查询项目列表的单个对象属性

C# 应用PredicateBuilder查询项目列表的单个对象属性,c#,linq,predicatebuilder,C#,Linq,Predicatebuilder,给定以下示例模型,我需要按其所有者的属性查询项目。 这是实体框架集,我想用LINQ来实现 public class Owner { public int Id { get; set; } public string Name { get; set; } //More than 20 other properties } class Item { public int Id { get; set; } public string Descr

给定以下示例模型,我需要按其所有者的属性查询项目。 这是实体框架集,我想用LINQ来实现

public class Owner
  {
    public int Id { get; set; }
    public string Name { get; set; }
    //More than 20 other properties
  }

  class Item
  {
    public int Id { get; set; }
    public string Description { get; set; }
    public Owner MyOwner { get; set; }
    public int idOwner { get; set; }
    //Several others properties
  }
我已经有了一个过滤器的所有者

我想将这个谓词(它基本上是where子句的内容)应用于
Owner
对象,以便获得其所有者满足谓词条件的所有

如果
所有者
是所有者列表。。。我可以使用
.Any(谓词)
,但它的基数是1

编辑:

public static Expression<Func<Owner, bool>> GetPredicate(OwnerCriteria criteria)
{
     var predicate = PredicateBuilder.True<Owner>();

     if (criteria.Active.HasValue) {
    predicate = predicate.And(p => p.Active == criteria.Active.Value);
     }
     //Several other criteria checkings as above

    return predicate;
}

我尝试这样做是为了避免必须获取所有满足谓词条件的
所有者,然后执行
包含(idOwner)

我已经看到了它为那些甚至没有相关
项的所有者创建的大量SQL案例

编辑2-谓词:

public static Expression<Func<Owner, bool>> GetPredicate(OwnerCriteria criteria)
{
     var predicate = PredicateBuilder.True<Owner>();

     if (criteria.Active.HasValue) {
    predicate = predicate.And(p => p.Active == criteria.Active.Value);
     }
     //Several other criteria checkings as above

    return predicate;
}
公共静态表达式GetPredicate(OwnerCriteria标准)
{
var predicate=PredicateBuilder.True();
if(criteria.Active.HasValue){
谓词=谓词和(p=>p.Active==criteria.Active.Value);
}
//其他几个标准检查如上所述
返回谓词;
}
标准是从用户过滤器中获得的。 然后,我通常使用它来查询owner集合,执行
db.owner.Where(谓词)

现在,从概念上讲,我需要做一些类似的事情:
db.Items.Where(x=>/*Items filters*/&&x.MyOwner.Where(myowerpredicate))
您可以简单地尝试一下:

Items.Where(i => predicate(i.Owner))
根据您的编辑2

db.Items.AsExpandable().Where(x => /*Items filters*/ && predicate.Invoke(x.Owner))

没有。。似乎由于谓词是为类型所有者创建的,因此无法将其应用于类型项。通常使用它的方法是db.owner.Where(谓词);您的想法不可编译。我尝试这样做是为了避免必须获取满足谓词条件的所有所有者,然后执行Contains(idOwner)。我已经看到了它为那些甚至没有相关“项”的所有者创建的masive SQL案例。你能分享一下你是如何实际使用谓词的吗?我只能猜测,因为你没有提供足够的信息来理解为什么你的谓词不能以这种方式工作。。。它不接受“&&”或“x.Owner”作为参数。我认为这是不可能的,我应该以其他方式优化OwnersID的数量。如果这不起作用,那么为什么要将其标记为答案?我迫切需要一个类似的解决方案。
项目
上的
所有者
属性是否应该是
所有者
类型而不是
int
?所有者是所有者类型,这是一个错误。我修好了。