我正在使用带有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; }
}
答案 0 :(得分:0)
解决方案是将LinqKit的Expand()扩展方法添加到构造的谓词中。
var query = db.Parents.Where(predicateParent.Expand()).Decompile();
感谢Gert对LinqKit的建议,它让我足够接近绊倒答案。