Фильтровать модель сущности по любому свойству и значению, передаваемому динамически - PullRequest
0 голосов
/ 25 июня 2019

У меня более 1 модели структуры сущностей, связанной с пациентами.

Теперь я хочу отфильтровать записи по некоторому списку значений свойства.

Я передам Список, в который подан мне нужно применить фильтр, который динамически.

Пример: класс с 2 свойствами 1) PropertyName & 2) FilterValue

Я передам список значений в следующем формате Row1) "TableName.PropertyName" & Value = "значение для фильтрации" Row1) "TableName.PropertyName" & Value = "значение для фильтрации" и т.д ...

Так что я не знаю заранее, в какой области мне нужно применить фильтр, он динамически определяется, и это может быть для нескольких свойств.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Говоря о динамике для Entity Framework, часто есть 2 простых решения (одно бесплатное, одно платное).

Для обоих решений вам нужно будет создать строку, содержащую вашу динамическую проекцию.

Бесплатно

LINQ Dynamic: https://github.com/StefH/System.Linq.Dynamic.Core

Очень популярная библиотека, которая позволяет легко обрабатывать этот сценарий

var query = context.Customers.Where("City == @0", "London");

Я рекомендую эту библиотеку, если вы хотитеобрабатывать самые основные сценарии

Платные

Отказ от ответственности : я владелец проекта Eval-Expression.NET

Эта библиотека более мощная благодаря использованию дерева выражений.Он поддерживает тот же синтаксис, что и C #

var query = context.Customers.Where(c => "c.City < @0", "London");
var query = context.Customers.Where(c => "c.City < city", new { city = "London"});
var query = context.Customers.Where(c => "c.City < city", entityWithCityProperty);

Эта библиотека может использоваться для более сложных сценариев.Это позволяет вам компилировать и выполнять динамический код C # во время выполнения.

0 голосов
/ 25 июня 2019

Вы можете добиться этого, используя отражение, но имейте в виду, что оно будет медленным для большого набора данных.

для следующего кода будет получено: Name: John, Age: 24

class Patient 
{
    public int Age { get; set; }    

    public string Name { get; set; }
}

static void Main(string[] args)
{
    var patients = new List<Patient> {
        new Patient { Age = 24, Name = "John"},
        new Patient { Age = 36, Name = "Johny"},
        new Patient { Age = 24, Name = "Jonas"},
        new Patient { Age = 18, Name = "John"},
    };

    var filters = new Dictionary<string,object>();
    filters.Add("Age", 24);
    filters.Add("Name", "John");

    var query = patients.AsQueryable();
    foreach (var filter in filters)
    {
        query = query.Where(p => p.GetType().GetProperty(filter.Key).GetValue(p, null).ToString() == filter.Value.ToString());
    }

    foreach (var patient in query.ToList())
    {
        System.Console.WriteLine($"Name: {patient.Name}, Age: {patient.Age}");                
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...