2016-02-02 111 views
0

确定的另一个元素的同一属性的值,我有这个类:过滤器列表等于嵌套列表

public class Person 
{ 
    public int Id { get; set; } 
    public string SpecialNumber { get; set; } 
    public IQueryable<Game> Games { get; set; } 
} 

而且这些类:

public class Game 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal? RamNeeded { get; set; } 
    public Town Town { get; set; } 
} 

public class Town 
{ 
    public int Id { get; set; } 
    public string TownName { get; set; } 
    public string CountryName { get; set; } 
    public string StateName { get; set; } 
} 

我需要显示PersonSpecialNumber,其总和的游戏RamNeeded是最大的,从人(IQueryable<Person>),谁拥有的游戏:

  1. 从2个以上不同城镇在一个国家
  2. 从不同美国在一个国家(这意味着至少有两场比赛不同的国家)。
  3. 从不同的国家(这意味着至少有两场比赛与不同的国家)。

我需要在LINQ或SQL上进行此查询。希望你能帮助。

+0

什么部分造成你的困难? –

+0

(1),(2),(3)是过滤标准,是否正确?它们是如何组合的 - “AND”或“OR”? –

+0

@DanBracuk如何比较LINQ中城镇名称的值第一名 –

回答

0

无论何时您需要对某些属性值相同的元素进行操作,可以使用GroupBy方法(或查询语法中的group子句)。

然后,您可以对每组元素使用不同的聚合函数。例如,您的情况Count可用于检查组是否包含特定数量的项目。

有了这样说,有问题的查询可以是这样的

IQueryable<Person> persons = ...; 

var query = 
    from person in persons 
    let countryGroups = person.Games.GroupBy(game => game.Town.CountryName) 
    where countryGroups.Count() > 1 // (3) 
     && countryGroups.Any(countryGroup => 
      countryGroup.GroupBy(game => game.Town.StateName).Count() > 1 // (2) 
      && countryGroup.GroupBy(game => game.Town.StateName).Any(stateGroup => 
       stateGroup.GroupBy(game => game.Town.Id).Count() > 2)) // (1) 
    let RamNeeded = person.Games.Sum(game => game.RamNeeded) // in case you need to include it in the select 
    orderby RamNeeded descending 
    select person.SpecialNumber; 

var result = query.FirstOrDefault();