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; }
}
Filter
는 DB에 지속 된 필터, 당신은 필터의 정의처럼 볼 수 있습니다. 필터를 정의하는 하나 이상의 FilterEntries
을 포함합니다. 포함 사항 및 제외 사항은 필터에 적용되는 제한 사항입니다.
예 :
var filter = new Filter
{
Inclusions = new[] { new FilterEntry { Age = 33 } },
Exclusions = new[] { new FilterEntry { Name = "John" }, new FilterEntry { Name = "Peter" } },
};
이 "존"또는 "베드로"라고하는 사람을 제외하고, 33 세 사람을 대표하는 Filter
정의합니다. 따라서이 필터가 사용자에게 적용되면 Johns와 Peters를 제외한 33 인 모든 사용자를 반환해야합니다.
이제 문제가 발생했습니다. 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;
주의 사항 Filter와 FilterEntry는 1-N 관계를 유지합니다. 코드를 단순화하기 위해 키를 생략했습니다.
필터의 이름/나이가 항상 맞습니까? 아니면 다른 필터 요구 사항을 제외 했습니까? – gh9
예, 간단히하기 위해 일부 필터를 제외 시켰습니다. 예를 들어, FilterEntry에 국가를 지정하면 네비게이션 속성이 포함되어 국가를 지정하면 포함/제외시킬 수 있습니다. FilterEntry의 속성에있는 null 값은 주어진 필터 필드가 설정되지 않았 음을 의미합니다. 예를 들어, FilterEntry는 모든 속성이 null이지만 Country는 국가 만 적용됨을 의미합니다. 그래서 Age가 nullable입니다. Null은 멤버에 대한 필터가 적용되는시기를 결정합니다. – SuperJMN