我有1个以上与患者相关的实体框架模型。
现在我想按“某些属性列表值”过滤记录。
我将把List传递给我需要动态应用过滤器的文件。
Ex:具有2个属性的类1)PropertyName&2)FilterValue
我将以以下格式传递值列表 Row1)“ TableName.PropertyName”&Value =“要过滤的值” Row1)“ TableName.PropertyName”&Value =“要过滤的值” 等等...
所以我事先不知道我需要对哪个文件进行动态确定的过滤器,它可能用于多个属性。
答案 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#代码。