【发布时间】: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