Как создать динамическое общее предложениеwhere для Entity Framework? Я пробовал, но не работает со свойствами ICollectiC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как создать динамическое общее предложениеwhere для Entity Framework? Я пробовал, но не работает со свойствами ICollecti

Сообщение Anonymous »

Я пытаюсь создать динамическое предложение Where, чтобы предложениеwhere генерировалось во время выполнения в качестве номинальных параметров. Я написал код, который отлично работает с прямым объектом, но при каждой попытке передать свойства из Collect выдается эта ошибка:

System.ArgumentException: 'Свойство экземпляра 'Name' не определен для типа «System.Collections.Generic.ICollection`1[Child]» (параметр «propertyName»)»

Здесь показан полный код :

Код: Выделить всё

public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public Child Child { get; set; }   // This worked
public ICollection Children { get; set; } // This collection does not work.
}

// Sample child entity
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public Parent Parent { get; set; }
}
И я использую приведенный выше код следующим образом:

Код: Выделить всё

public static void Main()
{
using (var context = new MyDbContext())
{
// Example of filtering by parent entity and its collection of child entities.
var filters = new Dictionary
{
{ "Name", "Parent1" },
{ "Child.Name","Child2" }  //Worked
{ "Children.Name", "Child1" } // Not work
};

var results = ApplyDynamicWhereClause
(context.Parents, filters).Include(p => p.Children).ToList();

foreach (var parent in results)
{
Console.WriteLine($"{parent.Name}:");

foreach (var child in parent.Children)
{
Console.WriteLine($"  {child.Name}");
}
}
}

public IQueryable ApplyDynamicWhereClause(IQueryable query, Dictionary filters)
{
var parameter = Expression.Parameter(typeof(T), "x");

Expression predicate = Expression.Constant(true);

foreach (var filter in filters)
{
string[] propertyPath = filter.Key.Split('.');

Expression property = parameter;
Type currentType = typeof(T);

foreach (var propertyName in propertyPath)
{
property = Expression.Property(property, propertyName);
currentType = currentType.GetProperty(propertyName).PropertyType;
}

var constant = Expression.Constant(filter.Value);
var equals = Expression.Equal(property, constant);

predicate = Expression.AndAlso(predicate, equals);
}

var lambda = Expression.Lambda(predicate, parameter);
return query.Where(lambda);
}
}
И макет DbContext:

Код: Выделить всё

public class MyDbContext : DbContext
{
public DbSet
 Parents { get; set; }
public DbSet Children { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//optionsBuilder.UseInMemoryDatabase("TestDb");
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Seed some data for testing
modelBuilder.Entity().HasData(
new Parent { Id = 1, Name = "Parent1" },
new Parent { Id = 2, Name = "Parent2" });

modelBuilder.Entity().HasData(
new Child { Id = 1, Name = "Child1", ParentId = 1 },
new Child { Id = 2, Name = "Child2", ParentId = 1 },
new Child { Id = 3, Name = "Child3", ParentId = 2 });
}
}
Я пробовал все от Google, но ничего не помогло.


Подробнее здесь: https://stackoverflow.com/questions/790 ... ed-but-doe
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»