Как сгруппировать IQueryable метод - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу сгруппировать список, чтобы избежать повторяющихся записей на экране

Я хочу иметь внутреннее объединение с SiteToEmp, которое необходимо залить, поскольку у меня есть метод IQueryable, который возвращает список из базы данных другой таблицы (SiteToEmp)иметь отношение, которое может записывать более одной записи для одного и того же внешнего ключа (SiteID), когда я делаю связь, мне нужно использовать группировку по первичному ключу, который не может преобразовать

  protected override IQueryable<SiteViewModel> BuildQuery(byte tab, byte? range, DateTime? start, DateTime? end, string role)
    {
        var source = typeof(Site).Name;
        if (range != null && range != 10 && range != 0)
            RequestUtil.RequestRangeFilter(UnitOfWork, range.Value, Parms.CompanyId, out start, out end);

        var query =
            (from site in UnitOfWork.SiteRepository.GetAll()
             join lookup in UnitOfWork.LookUpRepository.Find(l => l.CodeName == "Sitetype")
                 on site.SiteType equals lookup.CodeId into ldg
             from lookup in ldg.DefaultIfEmpty()

             join lookuptitle in UnitOfWork.LookUpTitlesRepository.Find(l =>
                     l.CodeName == "Sitetype" && l.Culture == Parms.Language)
                 on site.SiteType equals lookuptitle.CodeId into ltdg
             from lookuptitle in ltdg.DefaultIfEmpty()

             join district in UnitOfWork.DistrictRepository.GetAll()
                    on site.DistrictId equals district.Id into g2
             from district in g2.DefaultIfEmpty()

             join city in UnitOfWork.CityRepository.GetAll()
                 on site.CityId equals city.Id into g3
             from city in g3.DefaultIfEmpty()

             join country in UnitOfWork.CountryRepository.GetAll()
                 on site.CountryId equals country.Id into g4
             from country in g4.DefaultIfEmpty()

             join siteToEmp in UnitOfWork.SiteToEmployeesRepository.GetAll()
                 on site.Id equals siteToEmp.SiteId into g
             from siteToEmp in g.DefaultIfEmpty()

             join employee in UnitOfWork.EmployeeViewRepository.GetEmployeesByCompanyId(Parms.CompanyId,
                     Parms.Language)
                 on siteToEmp.EmpId equals employee.EmpId into g1
             from employee in g1.DefaultIfEmpty()

             select new SiteViewModel
             {
                 Id = site.Id,
                 Code = site.Code,
                 Name = site.Name,
                 LocalName = site.Name,
                 TimeZone = site.TimeZone,
                 Latitude = site.Latitude,
                 Longitude = site.Longitude,
                 Address = site.Address1,
                 City = city.Name,
                 District = district.Name,
                 Country = country.Name,
                 SiteTypeName = (lookuptitle == null ? lookup.Name : lookuptitle.Title),
                 SiteToEmployeesList = employee.EmpName,
                 ContactPerson = site.ContactPerson,
                 Email = site.Email,
                 Mobile = site.Telephone
             });//.GroupBy(k => k.Id).ToList(); 

        //var results = query.GroupBy(x => x.Id).ToList();
        return query;
    }

Невозможно неявно преобразовать тип System.Linq.IQueryable для 'System.Linq.IQueryable' Существует явное преобразование

Ответы [ 3 ]

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

Это было решено с помощью метода изменений типа To: public async Task >> GetSiteList (вкладка байта, диапазон байтов, DateTime? Начало, DateTime? Конец, строковая роль) {//////} insted of: protected overrideIQueryable BuildQuery (вкладка байтов, диапазон байтов, DateTime начало, DateTime конец, строковая роль) {////////}

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

Это было решено путем изменения типа метода:

    public async Task<List<SiteViewModel>> GetSiteList(byte tab, byte? range, DateTime? start, DateTime? end,string role){......} 

Вместо:

    protected override IQueryable BuildQuery(byte tab, byte? range, DateTime? start, DateTime? end, string role){.....}
0 голосов
/ 25 декабря 2018

Все, что вам нужно, это вернуть первый элемент в каждой группе:

var results = query.GroupBy(x => x.Id)
    .Select(g => g.FirstOrDefault())
    .ToList();

Я не знаю, имеет ли это значение, но это вернет «случайного» сотрудника, когда найдется больше сотрудников, которые соответствуютприсоединиться.Вы можете захотеть контролировать, какой сотрудник возвращается, заказав группу, например:

...
.Select(g => g.OrderBy(e => e.SiteToEmployeesList).FirstOrDefault())

Кстати, SiteToEmployeesList не содержит списка, а только одно имя.Лучше использовать более подходящее имя свойства.

Еще одно замечание: попробуйте использовать свойства навигации вместо всех этих подробных объединений.Т.е. свойства, такие как site.District, относящиеся к объекту District, или site.SiteToEmployees, содержащие список объектов SiteToEmployee и т. Д.

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