如何将DelegateDecompiler计算属性与PredicateBuilder和子集合一起使用

时间:2015-12-18 22:16:25

标签: .net entity-framework predicatebuilder

我正在使用带有Entity Framework的DelegateDecompiler来添加计算属性。我也使用PredicateBuilder为查询组合表达式。

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

例如:

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

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

按需运作。

我想使用A universal PredicateBuilder组合Where Expression,如此......

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; }
}

1 个答案:

答案 0 :(得分:0)

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

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

感谢Gert对LinqKit的建议,它让我足够接近绊倒答案。