简化多种真假组合条件

时间:2018-06-02 00:57:03

标签: c# sql asp.net logic

问题是我想从SQL表中提取特定记录并根据用户权限显示它(这是5个组合为true或false的情况)。是否有办法避免编写32个单独的检查以及32个单独的SQL select语句,对于组合的5个权限的所有true为false的情况?

例如:

<div id="head">set in middle and center</div>
<div id="main">
    <img src="https://i.stack.imgur.com/9rdPN.png" alt="">
</div>
 

依旧......

编辑:我想提一句,一个用户可以拥有多个权限,这是主要问题,为什么我说了32个案例。

3 个答案:

答案 0 :(得分:1)

将您的权限值放入数组中!!如果您对当前变量感兴趣,可以这样做:

bool[] privileges = new bool[] { priv1, priv2, priv3, priv4, priv4 };

一旦他们在那里,您可以使用LINQ生成IN子句:

var list = privileges
    .Select
    ( 
        (p,i) => new
        { 
            Index = i + 1, //Need to add 1, since array is zero-based
            Value = p 
        } 
    )
    .Where
    ( 
        p => p.Value 
    )
    .Select
    ( 
        p => string.Format("'{0}'", p.Index)
    );

var sql = string.Format
    (
        "SELECT * FROM table WHERE priv IN ({0}) ",
        string.Join(",", list)
    );

这将为您提供这种格式的SQL字符串:

SELECT * FROM table WHERE priv IN ('1','2')

强制性说明:

Why is SELECT * considered harmful?

Why avoid dynamic SQL?

答案 1 :(得分:0)

嗯,我想我会在自己想出怎样做之后回答这个问题,但非常感谢你们的建议。

它只是纯粹的SQL:

sql = "SELECT * from requestsTable WHERE priv IN (SELECT priv FROM privilegesTable WHERE userID=@userID)

答案 2 :(得分:-1)

这需要一些调整,但我认为这是一个想法。这基本上就是我在powershell中的做法

function Evaluate-Priv {
  param([int]$p)
  return Get-Random -Minimum 0 -Maximum 2
}

[array]$privs = @()

for($i = 1;$i -le 5;$i++){
  switch(Evaluate-Priv($i)) {
    1 { $privs += "$i," }
    default { continue }
  }
}

[string]$SqlCmd = @"
  SELECT * FROM t WHERE t.priv in ($privs)
"@

Write-Output $SqlCmd

几次运行的结果:

SELECT * FROM t WHERE t.priv in (2, 3, 4, 5,)
SELECT * FROM t WHERE t.priv in (2, 4, 5,)
SELECT * FROM t WHERE t.priv in (1, 4, 5,)