Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
C# 使用分组获取最年轻日期的Linq查询_C#_Linq - Fatal编程技术网

C# 使用分组获取最年轻日期的Linq查询

C# 使用分组获取最年轻日期的Linq查询,c#,linq,C#,Linq,我的案例,请参见下图: 我设计了一个查询并添加了一个分组,但分组并没有将记录减少到最年轻的ContractEndDate。这似乎对结果没有影响 public IQueryable<SoonObsoleteContractsViewModel> Get() { var countries = UnitOfWork.GetAll<Country>(); var companies = UnitOfWork.GetAll<Company>(); var

我的案例,请参见下图:

我设计了一个查询并添加了一个分组,但分组并没有将记录减少到最年轻的ContractEndDate。这似乎对结果没有影响

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->之前,会出现什么情况现在错误消失了,但是->当查询被传递到视图时,我得到了空列表。没有分组,所有记录都按预期列出