Что такое выражение запроса Linq, чтобы получить весь идентификатор отдела, имя в переменной списка выбора для раскрывающегося списка - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь создать раскрывающийся список, в котором будет указано название отдела, имеющее право на просмотр для зарегистрированного пользователя. Я передаю userId, DepotIds. Отдел должен быть указан напротив пользователя и депо. Мой запрос Linq не работает, помогите, пожалуйста, у меня есть следующая модель

 public class Depot
{
    public  int Id { get; set; }
    public string  DepotName { get; set; }

}
 public class Department
{
    public int Id { get; set; }
    public string  DepartmentName { get; set; }

}
     
 public class User
{
    public  int Id { get; set; }
    public string  UserName { get; set; }

}
public class USerDepotDepartmentLink
{
    public int UserId { get; set; }
    public int DepotId { get; set; }
    public int DepartmentId { get; set; }
    public IsDefault { get; set; }
}

Из вышеуказанной модели у меня есть следующие записи

Depot Record
Id = 1; DepotName = Depot1
Id = 2 ; DepotName = Depot2

Department Record
Id = 1; DepartmentName = Sales
Id = 2 ; DepartmentName = Account
Id = 3 ; DepartmentName = Marketing

User Record
Id = 1; Username = User1
Id = 2; Username = User2 

USerDepotDepartmentLink
UserId = 1, DepotId=1, DepartmentId =1 , IsDefault = 1 
UserId = 1, DepotId=1, DepartmentId =2 , IsDefault = 0

UserId = 2, DepotId=1, DepartmentId =2 , IsDefault = 0
UserId = 2, DepotId=1, DepartmentId =3 , IsDefault = 0
UserId = 2, DepotId=2, DepartmentId =1 , IsDefault = 0
UserId = 2, DepotId=2, DepartmentId =2 , IsDefault = 1
UserId = 2, DepotId=2, DepartmentId =3 , IsDefault = 0

из приведенного выше примера для UserId 1 В раскрывающемся списке «Отдел» должен быть «Продажи, счета» и выбрано «Отдел продаж».

Для userId 2, раскрывающийся список «Отдел» должен быть «Продажи, учетные записи, маркетинг», а выбранный отдел - «Учетная запись».

Я создал приведенный ниже запрос Linq, но не работает

 public IEnumerable<SelectListItem> GetLocationsByDepotForDropdown(int userId, int[] depotNo)
    {
        
        List<SelectListItem> locations = (from dpt in goContext.goDepartment
                                          join dep in goContext.goUserDepartment 
                                          on dpt.DepartmentID equals dep.DepartmentID
                                         where dep.UserID == userId
                                         && dpt.IsDeleted == false
                                         select new SelectListItem
                                         {
                                             Value = dpt.DepartmentID.ToString(),
                                             Text = dpt.DepartmentName
                                         }).Where(i => depotNo.Contains(i.Value)).
                                          ToList<SelectListItem>();
        locations.Insert(0, new SelectListItem
        {
            Value = "0",
            Text = "-- Select --"

        });
        return locations;
    }

 

Пожалуйста, помогите чтобы найти запрос linq из моего примера

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

См. Следующий пример кода, вы можете использовать предложение GroupBy для удаления повторяющихся записей (на основе свойства text и value), а затем проверьте, содержат ли элементы группы выбранное значение (True: IsDefault равно 1; False : IsDefault равно 0):

        var user = "User 2";

        var result = (from udd in usddlist
                      join u in userlist on udd.UserId equals u.Id
                      join d in departmentlist on udd.DepartmentId equals d.Id
                      where u.UserName == user
                      select new
                      {
                          Value = d.Id.ToString(),
                          Text = d.DepartmentName,
                          IsSelected = udd.IsDefault == 1 ? true : false
                      }).GroupBy(c => new { c.Text, c.Value })
              .Select(c =>
              new SelectListItem
              {
                  Value = c.Key.Value,
                  Text = c.Key.Text,
                  Selected = c.Where(d => d.IsSelected == true).ToList().Count == 0 ?false : true
              })
              .Distinct().ToList();

Начальные данные:

       List<Depot> depotlist = new List<Depot>()
        {
            new Depot(){ Id=1, DepotName="Depot 1"},
            new Depot(){ Id=2, DepotName="Depot 2"}
        };

        List<Department> departmentlist = new List<Department>()
        {
            new Department(){ Id=1, DepartmentName="Sales"},
            new Department(){ Id=2, DepartmentName="Account"},
            new Department(){ Id=3, DepartmentName="Marketing"},
        };
        List<User> userlist = new List<User>()
        {
            new User(){ Id=1, UserName="User 1"},
            new User(){ Id=2, UserName="User 2"}
        };

        List<USerDepotDepartmentLink> usddlist = new List<USerDepotDepartmentLink>()
        {
            new USerDepotDepartmentLink(){ UserId = 1, DepotId = 1, DepartmentId = 1,IsDefault=1},
            new USerDepotDepartmentLink(){ UserId = 1, DepotId = 1, DepartmentId = 2,IsDefault=0},
            new USerDepotDepartmentLink(){ UserId = 2, DepotId = 1, DepartmentId = 2,IsDefault=0},
            new USerDepotDepartmentLink(){ UserId = 2, DepotId = 1, DepartmentId = 3,IsDefault=0},
            new USerDepotDepartmentLink(){ UserId = 2, DepotId = 2, DepartmentId = 1,IsDefault=0},
            new USerDepotDepartmentLink(){ UserId = 2, DepotId = 2, DepartmentId = 2,IsDefault=1},
            new USerDepotDepartmentLink(){ UserId = 2, DepotId = 2, DepartmentId = 3,IsDefault=0},
         };

После выполнения приведенного выше кода результат, как показано ниже (выбранный отдел - это свойство Select Account, Sales and Marketing is "false"):

enter image description here

If you want to sort the DropDownlist items, after filter data, you could use Метод OrderBy () для сортировки элементов SelectList.

0 голосов
/ 03 августа 2020

Вы можете использовать запрос ниже, который даст уникальный отдел, а также можно выбрать требуемый вариант

List<SelectListItem> locations = (from dpt in goContext.goDepartment
                                      join dep in goContext.goUserDepartment
                                      on dpt.Id equals dep.DepartmentId
                                     where dep.UserId == userId && depotNo.Contains(dep.DepotId)
                                     select new
                                     {
                                         DepartmentId = dep.DepartmentId,
                                         DepartmentName = dpt.DepartmentName
                                     }).Distinct()
                                    .Select(s => new SelectListItem
                                     {
                                         Value = s.DepartmentId.ToString(),
                                         Text = s.DepartmentName,
                                         // Selected = write your logic here based on condition
                                     })
                                     .ToList<SelectListItem>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...