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

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

Сообщение Anonymous »

Я пытаюсь создать динамическое предложение WHERE, чтобы предложение WHERE генерировалось во время выполнения в качестве номинальных параметров. Я написал код, который отлично работает с прямым объектом, но при каждой попытке передать свойства из функции Collect возникает ошибка.

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

System.ArgumentException: 'Instance property 'Name' is not defined for type 'System.Collections.Generic.ICollection`1[Child]' (Parameter 'propertyName')'
Полный код приведен ниже.

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

public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public Child Child { get; set; } // Its 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);
}
}
А контекст Mock DB — это

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

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 ... d-but-does
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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