Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 如何将IQueryable方法分组_Linq_Api_Model View Controller_Onion Architecture - Fatal编程技术网

Linq 如何将IQueryable方法分组

Linq 如何将IQueryable方法分组,linq,api,model-view-controller,onion-architecture,Linq,Api,Model View Controller,Onion Architecture,我想对列表进行分组,以避免屏幕中的重复记录 我想有内部连接与SiteToEmp需要灌浆 由于我有一个IQueryable方法,它从数据库返回列表,另一个表(SiteToEmp)有一个关系,当我连接关系时,它可以为同一个外键(SiteID)记录多个记录,所以我必须使用按主键分组的方法,主键无法转换 protected override IQueryable<SiteViewModel> BuildQuery(byte tab, byte? range, DateTime? star

我想对列表进行分组,以避免屏幕中的重复记录

我想有内部连接与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;
    }
protected override IQueryable BuildQuery(字节选项卡、字节范围、日期时间开始、日期时间结束、字符串角色)
{
var source=typeof(Site).Name;
如果(范围!=null&&range!=10&&range!=0)
RequestUtil.RequestRangeFilter(UnitOfWork、range.Value、Parms.CompanyId、out start、out end);
变量查询=
(来自UnitOfWork.SiteRepository.GetAll()中的站点)
在UnitOfWork.LookUpRepository.Find(l=>l.CodeName==“Sitetype”)中加入查找
on site.SiteType等于ldg中的lookup.CodeId
从ldg.DefaultIfEmpty()中的查找
在UnitOfWork.LookupitlesRepository.Find(l=>
l、 代码名==“站点类型”&&l.Culture==Parms.Language)
on site.SiteType等于ltdg中的lookuptitle.CodeId
来自ltdg.DefaultIfEmpty()中的lookuptitle
在UnitOfWork.DistrictRepository.GetAll()中加入district
现场.DistrictId等于g2中的district.Id
来自g2.DefaultIfEmpty()中的地区
在UnitOfWork.CityRepository.GetAll()中加入城市
in site.CityId等于进入g3的city.Id
来自g3中的城市。DefaultIfEmpty()
在UnitOfWork.CountryRepository.GetAll()中加入country
在site.CountryId等于国家Id进入g4
来自g4.DefaultIfEmpty()中的国家/地区
加入UnitOfWork.SiteToEmployeesRepository.GetAll()中的siteToEmp
on site.Id等于siteToEmp.SiteId到g
从SiteToEmpty导入g.DefaultIfEmpty()
将员工加入UnitOfWork.EmployeeViewRepository.GetEmployeesByCompanyId(Parms.CompanyId,
参数(语言)
在siteToEmp.EmpId等于employee.EmpId到g1
来自g1.DefaultIfEmpty()中的员工
选择新的SiteViewModel
{
Id=site.Id,
代码=站点代码,
Name=site.Name,
LocalName=site.Name,
时区=site.TimeZone,
纬度=站点。纬度,
经度=站点。经度,
地址=site.Address1,
City=City.Name,
District=地区名称,
Country=Country.Name,
SiteTypeName=(lookuptitle==null?lookup.Name:lookuptitle.Title),
SiteToEmployeesList=employee.EmpName,
ContactPerson=site.ContactPerson,
Email=site.Email,
移动电话
});//.GroupBy(k=>k.Id).ToList();
//var results=query.GroupBy(x=>x.Id).ToList();
返回查询;
}
无法将类型System.Linq.IQueryable隐式转换为“System.Linq.IQueryable”
存在显式转换

您只需返回每个组的第一项:

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
包含
SiteToEmployees
对象列表等。

通过将方法类型更改为: 公共异步任务>>获取站点列表(字节选项卡、字节范围、日期时间开始、, DateTime?结束,字符串角色){ 代替: 受保护的覆盖IQueryable BuildQuery(字节选项卡、字节范围、日期时间开始、日期时间结束、字符串角色)
{//}

通过将方法类型更改为:

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

那代码不能编译。
Task>>
应该是什么?
Task
嗯,这并不能解决任何问题。它只会使代码异步,但仍然无法返回正确的类型。您仍然需要将
i分组
转换为
列表
,我的代码就是这样做的。我尝试了这个
公共异步任务GetSiteList(字节选项卡,字节范围,日期时间开始,日期时间结束,字符串角色)
,它已经返回了列表分组,但问题在视图中出现,因为视图似乎没有数据,列表如何有数据,我使用Json发送列表是的,这只是一个问题。现在,调用者必须打开分组。
    protected override IQueryable BuildQuery(byte tab, byte? range, DateTime? start, DateTime? end, string role){.....}