C# 如何编写LINQ以仅获取与所示列相关的特定条件匹配的行?
我有以下场景:我需要显示一个包含3列的表,每个列有2个子列和相应的值(DB表包含子列,分组在UI级别完成): 那么这个呢:C# 如何编写LINQ以仅获取与所示列相关的特定条件匹配的行?,c#,sql,linq,logic,C#,Sql,Linq,Logic,我有以下场景:我需要显示一个包含3列的表,每个列有2个子列和相应的值(DB表包含子列,分组在UI级别完成): 那么这个呢: model.List = model.List.Where(x => showA && ((x.a1 ?? 0) != 0 || (x.a2 ?? 0) != 0) || showB && ((x.b1 ?? 0) != 0 || (x.b2 ?? 0) != 0) || showC && ((x
model.List = model.List.Where(x =>
showA && ((x.a1 ?? 0) != 0 || (x.a2 ?? 0) != 0) ||
showB && ((x.b1 ?? 0) != 0 || (x.b2 ?? 0) != 0) ||
showC && ((x.c1 ?? 0) != 0 || (x.c2 ?? 0) != 0));
试试这个
model.List = model.List.Where(x => showA && (Convert.ToInt32(a1) + Convert.ToInt32(a2)) != 0 || showB && (Convert.ToInt32(b1) + Convert.ToInt32(b2)) != || showC && (Convert.ToInt32(c1) + Convert.ToInt32(c2)) != );
我的看法是,您需要一行的模型表示。
F.e.列表将保留6个对象(a1、a2、b1、b2、c1、c2),然后每个对象应具有“列可见性(bool)”和“值(int或任何您想要的值)”等属性。然后,您将有一个清晰而独立的逻辑。因此,您可以检查一行中的所有值,并就可见性做出决定。只需尝试将复杂任务划分为几个子任务。我将选择一个简化的逻辑:
return model.List.Where(x =>
(showA && ((x.a1 ?? 0) != 0)) ||
(showA && ((x.a2 ?? 0) != 0)) ||
(showB && ((x.b1 ?? 0) != 0)) ||
(showB && ((x.b2 ?? 0) != 0)) ||
(showC && ((x.c1 ?? 0) != 0)) ||
(showC && ((x.c2 ?? 0) != 0))
).ToList();
Any
显示…
和Any(相关、非空或-0值)”子列“应该生成行。db表中的子列?那是什么?是的,我错了。更新问题是,您最终需要所有这些单独的条件或“ed”,但当您连续执行Where
调用时,它正在和“ing”这些条件。您必须为一个在其中
调用建立一个条件。我知道。这就是困惑所在。我认为真正的问题是不能用空值填充表格。因此,您可以通过确保在填充表时用string.Empty替换null来解决问题。首先,您认为当其中一列为null
时会发生什么情况?第二,当整个问题是它们需要被or.1.Convert.ToInt32(null)=02时,这最终还是会将它们和单独的条件放在一起。我不明白这个问题,如果你想使用所有bool参数,你可以将它组合到一个查询中,如果你做,Where(x=>x>1)。Where(x=>x也是需要的OP!=0。他们没有提到是否可以使用负值。也可以使用(x.a1±0)!=0
而不是缩写为x.a1!=null&&x.a1!=0
。请看好主意!更新了我的答案。我们需要更多括号!
model.List = model.List.Where(x => showA && (Convert.ToInt32(a1) + Convert.ToInt32(a2)) != 0 || showB && (Convert.ToInt32(b1) + Convert.ToInt32(b2)) != || showC && (Convert.ToInt32(c1) + Convert.ToInt32(c2)) != );
return model.List.Where(x =>
(showA && ((x.a1 ?? 0) != 0)) ||
(showA && ((x.a2 ?? 0) != 0)) ||
(showB && ((x.b1 ?? 0) != 0)) ||
(showB && ((x.b2 ?? 0) != 0)) ||
(showC && ((x.c1 ?? 0) != 0)) ||
(showC && ((x.c2 ?? 0) != 0))
).ToList();