我正在处理一个查询,其中我想检索包含多个int?键的数据。我的输出Dto:
public class FilterParamsDto {
public int? StudentId { get; set; }
public int? NationalityId { get; set; }
public int? CountryId { get; set; }
public int? SchoolCountryId { get; set; }
public int? SchoolStateId { get; set; }
public int? SchoolCityId { get; set; }
.... More keys
}
我使用了以下查询
var value = from y in data
where dto.CountryId == null
? y.CountryId != null
: y.IntakeId == dto.CountryId && dto.StudentId == null
? y.StudentId != null
: y.StudentId == dto.StudentId && dto.SchoolCityId == null
? y.SchoolCityId != null
: y.SchoolCityId == dto.SchoolCityId
select y;
我想实现的目标:
我想做一个方法,如果任何属性有一些值,我想根据该特定属性筛选数据,如果没有任何值,我想根据另一个有一些值的属性筛选数据。如果任何属性有0值,我想跳过筛选,因为如果任何属性有0值,所以数据不会匹配,我不会使用接收任何数据||数据未按所需条件进行筛选。
编辑1有三种可能性:所有属性都有一些值,一些属性关心值,所有属性关心值。所需的逻辑应该像如果第一个在哪里执行,那么另一个在哪里应该在更新的值上执行,等等。
3条答案
按热度按时间j9per5c41#
给予一个例子,这样做
根据需要添加任意多个条件。
cbeh67ev2#
要按第一个可用的过滤器属性进行过滤,可以写(我用
filter
替换了dto
,用d
替换了y
,使其更清晰):要按所有可用筛选器进行筛选:
测试
(d.CountryId ?? d.IntakeId) == filter.CountryId
会比较d.CountryId
是否不为空值,否则会比较d.IntakeId
与filter.CountryId
。根据?? and ??= operators (C# reference)的文档:
如果左操作数不为空,则空合并运算符“”返回左操作数的值;否则,它计算右边的操作数并返回结果。
plicqrtu3#
如果你有很多类似上面的属性,并且有多个版本的这种过滤操作,我建议你构建一个动态表达式来过滤你的集合。被查询的实体和DTO具有相同的属性名称和相似的类型。
Fiddle