Sup*_*JMN 2 c# entity-framework filter entity-framework-core
我有一个只有 3 个类的模型:User,Filter和FilterEntry.
class Filter
{
public List<FilterEntry> Inclusions { get; set; }
public List<FilterEntry> Exclusions { get; set; }
}
public class FilterEntry
{
public string Name { get; set; }
public int? Age { get; set; }
}
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
一个Filter是被持久化到数据库过滤器,你可以看到它像一个过滤器的定义。它包含一个或多个FilterEntries定义过滤器。Inclusions 和 Exclusions 是适用于过滤器的限制。
一个例子:
var filter = new Filter
{
Inclusions = new[] { new FilterEntry { Age = 33 } },
Exclusions = new[] { new FilterEntry { Name = "John" }, new FilterEntry { Name = "Peter" } },
};
Run Code Online (Sandbox Code Playgroud)
这定义了一个Filter代表 33 岁的人,除了被称为“约翰”或“彼得”的人。因此,当将此过滤器应用于用户时,它应该返回所有 33 岁的用户,Johns 和 Peters 除外。
现在的问题。如何使用 Entity Framework 创建一个查询,给定一个过滤器,根据它返回用户?
我什至不知道如何开始!我只有这个:
Filter filter = dbContext.Filters.First(x => x.FilterId == filterId);
var filteredUsers = from u in dbContext.Users
where ... // user is any of the in filter.Inclusions
where ... // user is not in any of the filter.Exclusions
select u;
Run Code Online (Sandbox Code Playgroud)
注意 Filter 和 FilterEntry 保持 1-N 关系。我省略了简化代码的键。
你想建立一个动态的 where 子句,所以我推荐PredicateBuilder. 我还没有测试下面的代码,但你会想要像......
Filter filter = dbContext.Filters.First(x => x.FilterId == filterId);
var pb = new PredicateBuilder<User>();
foreach(var inclusion in filter.Inclusions)
{
if(inclusion.Age.HasValue)
{
pb = pb.And(p => p.Age == inclusion.Age.Value);
}
if(!string.IsNullOrWhiteSpace(inclusion.Name))
{
pb = pb.And(p => p.Name == inclusion.Name);
}
}
foreach(var exclusion in filter.Exclusions)
{
if(exclusion.Age.HasValue)
{
pb = pb.And(p => p.Age != exclusion.Age.Value);
}
if(!string.IsNullOrWhiteSpace(exclusion.Name))
{
pb = pb.And(p => p.Name != exclusion.Name);
}
}
var filteredUsers = dbContext.Users.AsExpandable().Where(pb);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4687 次 |
| 最近记录: |