Упрощение нескольких истинных или ложных комбинированных условий - PullRequest
0 голосов
/ 02 июня 2018

Проблема в том, что я хочу извлечь определенные записи из таблицы SQL и отобразить их в соответствии с привилегиями пользователя (в случае 5 комбинированных значений true или false).Есть ли способ избежать написания 32 отдельных проверок, а также 32 отдельных операторов выбора SQL для всех случаев true для false для комбинированных 5 привилегий?

ex:

bool priv1 true|false;
bool priv2 true|false;
bool priv3 true|false;
bool priv4 true|false;
bool priv5 true|false;

if (priv1 && !priv2 && !priv3 && !priv4 && !priv5)
{
    string sql = "SELECT * FROM table WHERE priv='1'";
}

и т. Д.на ....

Редактировать: Я хочу упомянуть, что один пользователь может иметь несколько привилегий, и это главная проблема, и поэтому я сказал 32 случая.

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Получите ваши значения привилегий в массив !!Если вы застряли с текущими переменными, вы можете просто сделать это:

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')

Обязательные примечания:

Почему SELECT * считается вредоносным?

Зачем избегать динамического SQL?

0 голосов
/ 02 июня 2018

Что ж, я думаю, что отвечу на это после того, как сам разберусь, как это сделать, но на самом деле спасибо парням за ваши предложения.

это будет чистый SQL только так:

sql = "SELECT * from requestsTable WHERE priv IN (SELECT priv FROM privilegesTable WHERE userID=@userID)
0 голосов
/ 02 июня 2018

Это потребует некоторой доработки, но я думаю, что это идея.По сути, это то, как я бы сделал это в 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,)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...