2015-12-18 4 views
2

Я использую DelegateDecompiler с Entity Framework для добавления вычисленных свойств. Я также использую PredicateBuilder для составления выражений для запросов.Как использовать вычисляемые свойства DelegateDecompiler с PredicateBuilder и дочерними коллекциями

У меня возникли проблемы с получением вычисляемых свойств в SQL при использовании PredicateBuilder.

Для примера:

Получить родитель, детские ПолноеИмя начинается с А, где FullName является вычисляемым свойством

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

Работы по желанию.

Я хочу, чтобы составить Где Expression, используя A universal PredicateBuilder как так ...

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(); 

Но он бросает исключение: Указанный тип члена «FullName» не поддерживается в LINQ к Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности.

Как можно использовать предикаты с вычисленными свойствами в коллекции детей?

Вот классы сущностей.

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

Похож, что 'AsQueryable()' и 'Decompile()' не играют хорошо вместе. Возможно, вы должны попробовать попробовать предикат Linqkit. (Хотя в целом, я также предпочитаю тот, который вы используете). –

+0

Спасибо за подсказку. Я попробовал построитель предикатов LinqKit, но это не сработало. Однако расширение Expand() LinqKit помогло. Я добавил .Expand() в предикат в этой строке 'var query = db.Parents.Where (predicateParent.Expand()). Decompile();' и он сработал. – user1488937

ответ

0

Решение было добавить метод расширения LinqKit Expand() в построенный предикат, подобный этому.

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

Спасибо Герт за LinqKit предложение, это заставило меня достаточно близко, чтобы наткнуться на ответ.