Как я могу установить условный оператор C # if и оператор LINQ where? - PullRequest
0 голосов
/ 05 декабря 2018

Подробная информация о моей ситуации: если у пользователя есть разрешения на просмотр элементов определенного местоположения, мне нужен запрос, чтобы выбрать элементы, которые имеют средства, соответствующие разрешениям, которые есть у пользователя.Пользователь может иметь разрешения на несколько объектов.Там может быть пользователь, который имеет доступ к LOC1, LOC2, а также LOC3.Может быть пользователь с доступом только к LOC1.Я мог бы упустить что-то очень простое, чтобы решить эту проблему.

if(System.Web.HttpContext.Current.User.IsInRole("App_Inventory_LOC1_Access")) 
{
    items = items.Where(s => s.Facility == "LOC1");
}

if(System.Web.HttpContext.Current.User.IsInRole("App_Inventory_LOC2_Access")) 
{
    items = items.Where(s => s.Facility == "LOC2");
}

if(System.Web.HttpContext.Current.User.IsInRole("App_Inventory_LOC3_Access")) 
{
    items = items.Where(s => s.Facility == "LOC3");
}

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Вы можете изменить его с помощью словаря для сопоставления роли пользователя с объектом:

var userFacilityMapping = new Dictionary<string, string>
{
    ["App_Inventory_LOC1_Access"] = "LOC1",
    ["App_Inventory_LOC2_Access"] = "LOC2",
    ["App_Inventory_LOC3_Access"] = "LOC3",
};
var userFacilities = userFacilityMapping
    .Where(x => HttpContext.Current.User.IsInRole(x.Key))
    .Select(x => x.Value)
    .ToArray();

items = items.Where(x => userFacilities.Contains(x.Facility));
0 голосов
/ 05 декабря 2018

Я думаю, вы перезаписываете свой набор результатов.Скажем, если у вас есть доступ к LOC1 и LOC3, он сначала выберет все элементы LOC1, а затем из элементов LOC1 выберет пустые элементы LOC3.

Вы хотите отфильтровать только исходный набор предметов.Что-то вроде

var results = new List<Item>();

if(System.Web.HttpContext.Current.User.IsInRole("App_Inventory_LOC1_Access")) 
{
    results.AddRange(items.Where(s => s.Facility == "LOC1"));
}

if(System.Web.HttpContext.Current.User.IsInRole("App_Inventory_LOC2_Access")) 
{
    results.AddRange(items.Where(s => s.Facility == "LOC2"));
}

if(System.Web.HttpContext.Current.User.IsInRole("App_Inventory_LOC3_Access")) 
{
    results.AddRange(items.Where(s => s.Facility == "LOC3"));
}
0 голосов
/ 05 декабря 2018

Таким образом, вы просто строите список разрешенных объектов, а затем проверяете, есть ли в них s.Facility:

var facilities = new List<string>();
if(System.Web.HttpContext.Current.User.IsInRole("App_Inventory_LOC1_Access")) 
{
    facilities.Add("LOC1");
}
// same for other facilities
// ...

items = items.Where(s => facilities.Contains(s.Facility));

Чтобы еще больше упростить его, вы можете сгруппировать роли и объекты в какую-то карту,и повторить это - значительно упростит добавление новых возможностей, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...