Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何编写LINQ以仅获取与所示列相关的特定条件匹配的行?_C#_Sql_Linq_Logic - Fatal编程技术网

C# 如何编写LINQ以仅获取与所示列相关的特定条件匹配的行?

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

我有以下场景:我需要显示一个包含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.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();