C# linq 查询,每个属性的 where 子查询
Posted
技术标签:
【中文标题】C# linq 查询,每个属性的 where 子查询【英文标题】:C# linq query with where subquery for each property 【发布时间】:2021-03-08 16:06:40 【问题描述】:我有这张桌子:
我想做一个 linq 查询,根据 adminfilterfieldid 获取每个属性值。
到目前为止我有这个:
newDto = from d in DbContext.AdminFilterItems
where d.AdminFilterID == filterId
select new ReservationDto
BookingDate = d.Value
;
现在由于 BookingDate 是 AdminFilterFieldId 是 2,我希望我可以做类似 BookingDate = d.Value.Where(s => s.AdminFilterFieldID = 3)
或 null 的事情,以防该 adminfilterfieldid 没有值。
我想为该 adminfilterid 的所有字段执行此操作。
这种查询是否可以通过某种方式实现,还是我需要进行多个查询?
【问题讨论】:
您需要使用反射来枚举类(模型)属性,或者创建一个将字符串属性名称与类中的属性匹配的接口。d.Value
是单行值,而不是组。您要么需要在AdminFilterID
上进行分组,要么将where
放在select
之前以仅拉取行,可能在整个查询中使用.DefaultIfEmpty()
,以便在没有AdminFilterFieldID
值3
存在时。这似乎是一个糟糕的数据库设计,不适合关系数据库(除非有令人信服的理由使用它 - 例如,可能有多个重复的 AdminFilterFieldID
s。)
@NetMage 有多个过滤器字段prntscr.com/vq1vl3,现在因为我正在构建要执行的查询,所以我需要检查该搜索字段的值是否存在或其为空。感谢您的 cmets
但除非过滤器字段是动态的,否则您可以只使用每个过滤器字段一列的常规 SQL 表。您是否即时创建过滤器字段?
【参考方案1】:
它看起来很简单,只是你的 where 中的另一个子句。
from d in DbContext.AdminFilterItems
where d.AdminFilterID == filterId
&& d.AdminFilterFieldID = 3
select new ReservationDto
BookingDate = d.Value
;
如果您需要根据多个值对其进行过滤,只需保留初始查询并对其运行其他过滤器,然后进行投影(选择)。
var qry = from d in DbContext.AdminFilterItems
where d.AdminFilterID == filterId
// Filter 1
qry.Where(d => d.AdminFilterFieldID = 3).Select(d => new ReservationDto
BookingDate = d.Value
);
// Filter 2
qry.Where(d => d.AdminFilterFieldID = 2).Select(d => new ReservationDto
BookingDate = d.Value
);
【讨论】:
以上是关于C# linq 查询,每个属性的 where 子查询的主要内容,如果未能解决你的问题,请参考以下文章
C# 使用带有 where 子句的 Linq 查询作为 dataTable 上的变量
如何在 linq 查询 c# 中的 WHERE 语句后嵌入动态 OR 条件
LINQ 查询在 C# 中使用实体框架获取单列和单行值而不使用 Where