通过动态传递的任何属性和值过滤实体模型

时间:2019-06-25 16:11:32

标签: c# entity-framework

我有1个以上与患者相关的实体框架模型。

现在我想按“某些属性列表值”过滤记录。

我将把List传递给我需要动态应用过滤器的文件。

Ex:具有2个属性的类1)PropertyName&2)FilterValue

我将以以下格式传递值列表 Row1)“ TableName.PropertyName”&Value =“要过滤的值” Row1)“ TableName.PropertyName”&Value =“要过滤的值” 等等...

所以我事先不知道我需要对哪个文件进行动态确定的过滤器,它可能用于多个属性。

2 个答案:

答案 0 :(得分:0)

您可以使用反射来实现,但是请注意,在大型数据集上,反射会很慢。

以下代码的输出是: 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}");                
    }

}

答案 1 :(得分:0)

当谈到实体框架的动态性时,通常有2种简单的解决方案(一种是免费的,一种是付费的)。

对于这两种解决方案,您都需要构建一个包含动态投影的字符串。

免费

LINQ动态: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#代码。