Я использую 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; }
}
Похож, что 'AsQueryable()' и 'Decompile()' не играют хорошо вместе. Возможно, вы должны попробовать попробовать предикат Linqkit. (Хотя в целом, я также предпочитаю тот, который вы используете). –
Спасибо за подсказку. Я попробовал построитель предикатов LinqKit, но это не сработало. Однако расширение Expand() LinqKit помогло. Я добавил .Expand() в предикат в этой строке 'var query = db.Parents.Where (predicateParent.Expand()). Decompile();' и он сработал. – user1488937