C# 使用分组获取最年轻日期的Linq查询
我的案例,请参见下图: 我设计了一个查询并添加了一个分组,但分组并没有将记录减少到最年轻的ContractEndDate。这似乎对结果没有影响C# 使用分组获取最年轻日期的Linq查询,c#,linq,C#,Linq,我的案例,请参见下图: 我设计了一个查询并添加了一个分组,但分组并没有将记录减少到最年轻的ContractEndDate。这似乎对结果没有影响 public IQueryable<SoonObsoleteContractsViewModel> Get() { var countries = UnitOfWork.GetAll<Country>(); var companies = UnitOfWork.GetAll<Company>(); var
public IQueryable<SoonObsoleteContractsViewModel> Get()
{
var countries = UnitOfWork.GetAll<Country>();
var companies = UnitOfWork.GetAll<Company>();
var contracts = UnitOfWork.GetAll<Contract>();
var query = from country in countries
join company in companies on country.Id equals company.CountryId
join contract in contracts on company.Id equals contract.CompanyId
select new SoonObsoleteContractsViewModel
{
CountryName = contry.Name,
CompanyName = company.Name,
CompanyId = company.CompanyId
ContractBeginDate = contract.Begin,
ContractEndDate = contract.End,
ContractId = contract.Id
};
query.GroupBy(c => c.CompanyId, (key, e) => e.OrderBy(f => f.ContractEndDate).First());
return query;
}
public IQueryable Get()
{
var countries=UnitOfWork.GetAll();
var companys=UnitOfWork.GetAll();
var contracts=UnitOfWork.GetAll();
var查询=来自国家/地区中的国家/地区
在国家/地区的公司中加入公司。Id等于company.CountryId
在公司的合同中加入合同。Id等于合同。公司Id
选择新的SOONOBOLETEContractsviewmodel
{
CountryName=contry.Name,
CompanyName=company.Name,
CompanyId=company.CompanyId
ContractBeginDate=合同。开始,
ContractEndDate=合同。结束,
contracted=contract.Id
};
GroupBy(c=>c.CompanyId,(key,e)=>e.OrderBy(f=>f.ContractEndDate.First());
返回查询;
}
任何帮助都将不胜感激。按国家和公司分组,然后在组中获取最新合同结束日期的记录
var result = query
.GroupBy(_ => new { _.CountryName, _.CompanyId})
.Select(g => g.OrderByDescending(c => c.ContractEndDate).First())
.ToList();
或者换一种说法
var query = from contry in countries
join company in companies on country.Id equals company.CountryId
join contract in contracts on company.Id equals contract.CompanyId
let viewModel = new SoonObsoleteContractsViewModel
{
CountryName = contry.Name,
CompanyName = company.Name,
CompanyId = company.CompanyId
ContractBeginDate = contract.Begin,
ContractEndDate = contract.End,
ContractId = contract.Id
}
group viewModel by new { viewModel.CountryName, viewModel.CompanyId } into g
select g.OrderByDescending(c => c.ContractEndDate).First();
多亏了恩科西,我终于解决了这个问题:
var query = from contry in countries
join company in companies on country.Id equals company.CountryId
join contract in contracts on company.Id equals contract.CompanyId
let viewModel = new SoonObsoleteContractsViewModel
{
CountryName = contry.Name,
CompanyName = company.Name,
CompanyId = company.CompanyId
ContractBeginDate = contract.Begin,
ContractEndDate = contract.End,
ContractId = contract.Id
}
group viewModel by new { viewModel.CountryName, viewModel.CompanyId } into g
select g.OrderByDescending(c => c.ContractEndDate).FirstOrDefault();
我所要做的就是将First()更改为First或default!否则,查询将生成一个空列表。您所说的“按公司和国家分组”是什么意思?在您的示例中,您从每个国家选择最年轻的合同,而不考虑公司。@yinnonsanders:对不起,我不清楚。由于一个国家可以有n个不同的公司,因此每个国家可以有n个记录,其中国家组中每个公司的合同最年轻。我将更正我的表。“它似乎对结果没有影响。”那么
var result=query.GroupBy(..
(忘记了LINQ方法返回结果了吗?)@Manu感谢您的澄清。我认为结果中应该还有一个额外的德国条目,但目的是明确的。看起来,当我在ViewModel的select new语句的}之后进行分组时,结果是一个空列表。如果我尝试将分组放在ViewModel select->之前,会出现什么情况现在错误消失了,但是->当查询被传递到视图时,我得到了空列表。没有分组,所有记录都按预期列出