使用LINQ从集合的属性中检索最大数量

时间:2016-02-06 11:34:47

标签: c# linq

这是我的模特:

public class SeasonScore
{
    [Key]
    public int SeasonScoreID { get; set; }

    [DisplayName("Season")]
    public string season { get; set; }

    [DisplayName("Year")]
    public int year { get; set; }

    [DisplayName("Value")]
    public decimal value { get; set; }

    [DisplayName("Subject")]
    public virtual Subject Subject { get; set; }
}

public class Subject
{
    [Key]
    public int SubjectID { get; set; }

    [DisplayName("Subject")]
    public string subject { get; set; }

    [DisplayName("Scores")]
    public virtual List<SeasonScore> scores { get; set; }

    public Subject()
    {
        scores = new List<SeasonScore>();
    }
}

正如您可以看到&#34;主题&#34;的每个实例包含&#34; SeasonScore&#34;的列表。您还可以看到SeasonScore有一个十进制属性,名为&#34; value&#34;。

我有一个存储Subject对象列表的数据库。我想找到最大的&#34;值&#34;来自我的数据库中任何Subject实例中包含的任何SeasonScore实例的属性。

我可以做到这一点,但是我确信我应该能够使用LINQ快速完成它,尽管我无法理解它。

3 个答案:

答案 0 :(得分:2)

假设您的类已使用LINQ2SQL或Entity Framework正确映射到数据库,您可以使用Max检索最大值,如下所示:

var maxVal = dbContext
    .Subjects
    .Max(s => s.scores.Max(v => v.value));

var maxVal = dbContext
    .Subjects
    .SelectMany(s => s.scores)
    .Max(v => v.value);

在这两种情况下,查询都将转换为SQL,并在RDBMS中完全生成单个标量。

答案 1 :(得分:1)

您可以获得每个主题分数的最大值列表:

IEnumerable<decimal> max = subjects.Select(a => a.scores.Max(b => b.value));

答案 2 :(得分:1)

您可以使用Enumerable.Max功能。它有一个过载,需要一个选择器。获得每个主题的最大值列表后,再次调用Max函数以获取这些值中的最大值。

subjects.Select(x => x.scores.Max(y => y.value)).Max();

在行动here中查看。