【问题标题】:How to use DelegateDecompiler computed properties with PredicateBuilder and child collections如何将 DelegateDecompiler 计算属性与 PredicateBuilder 和子集合一起使用
【发布时间】:2015-12-18 22:16:25
【问题描述】:

我正在使用 DelegateDecompiler 和实体框架来添加计算属性。我还使用 PredicateBuilder 来编写查询表达式。

我在使用 PredicateBuilder 时将计算属性导入 SQL 时遇到问题。

例如:

获取孩子的 FullName 以 A 开头的父母,其中 FullName 是一个计算属性

context.Parents.Where(p => p.Children.Any(c => c.Fullname.StartsWith("A"))).Decompile()

按需要工作。

我想像这样使用A universal PredicateBuilder 编写 Where 表达式 ...

var predicateParent = PredicateBuilder.True<ParentEntity>();
var predicateChild = PredicateBuilder.True<ChildEntity>();
predicateChild = predicateChild.And(c => c.FullName.StartsWith("A"));
predicateParent = predicateParent.And(x => x.Children.AsQueryable().Any(predicateChild));
var query = db.Parents.Where(predicateParent).Decompile();
List<ParentEntity> parents = query.ToList();

但它会抛出异常:LINQ to Entities 不支持指定的类型成员“FullName”。仅支持初始化程序、实体成员和实体导航属性。

谓词如何与子集合中的计算属性一起使用?

这里是实体类。

    public class ParentEntity
    {
        public ParentEntity()
    {
        Children = new List<ChildEntity>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public virtual List<ChildEntity> Children { get; set; }

    [Computed]
    [NotMapped]
    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }
}

public class ChildEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }

    [Computed]
    [NotMapped]
    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }

    public int ParentId { get; set; }
    public virtual ParentEntity Parent { get; set; }
}

public class ParentChildModel: DbContext
{
    public ParentChildModel()
        : base("name=ParentChildModel")
    {
    }

    public virtual DbSet<ParentEntity> Parents { get; set; }
    public virtual DbSet<ChildEntity> Children { get; set; }
}

【问题讨论】:

  • 看起来AsQueryable()Decompile() 不在一起玩。也许你应该试试 Linqkit 的谓词构建器。 (虽然总的来说,我也更喜欢你使用的那个)。
  • 感谢您的提示。我尝试了 LinqKit 的谓词生成器,但它不起作用。然而,LinqKit 的 Expand() 扩展确实有帮助。我在 var query = db.Parents.Where(predicateParent.Expand()).Decompile(); 这一行的谓词中添加了 .Expand() 并且它起作用了。

标签: .net entity-framework predicatebuilder


【解决方案1】:

解决方案是像这样将 LinqKit 的 Expand() 扩展方法添加到构造的谓词中。

var query = db.Parents.Where(predicateParent.Expand()).Decompile();

感谢 Gert 对 LinqKit 的建议,它让我足够接近以偶然发现答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多