Linq使用GroupBy时,Include无效

Bar*_*art 26 linq-to-entities ef-code-first entity-framework-4.3

包括matchparticipants不工作.我在调试时总是说Null.但是,当我将GroupBy置于评论中时,它可以正常工作.我使用实体框架4.3.1与代码优先.

实体:

public class Match
    {
        [ScaffoldColumn(false)]
        public int MatchId { get; set; }

        [Required(ErrorMessage = "Matchtype is a required field")]
        public int Scheme { get; set; }

        [Required]
        [DefaultValue(false)]
        public bool Finished { get; set; }

        public int Round { get; set; }


        // Relations
        [Required]
        public Category Category { get; set; }

        public Official Official { get; set; }

        public Slot Slot { get; set; }

        public ICollection<MatchParticipant> MatchParticipants { get; set; }
    }

 public class MatchParticipant
    {
        [ScaffoldColumn(false)]
        public int MatchParticipantId { get; set; }

        public int Points { get; set; }

        public int Goals { get; set; }

        [Required]
        public Match Match { get; set; }

        [Required]
        public Team Team { get; set; }
    }

public class Team
    {
        [ScaffoldColumn(false)]
        public int TeamId { get; set; }

        [Required(ErrorMessage="Name is a required field")]
        public string Name { get; set; }

        [Required(ErrorMessage="Number of players is a required field")]
        public int NumberOfPlayers { get; set; }

        [Required(ErrorMessage="Coach is a required field")]
        public string Coach { get; set; }

        [Required(ErrorMessage="Phone is a required field")]
        public string Phone { get; set; }

        public string CellPhone { get; set; }

        public string Fax { get; set; }

        [Required(ErrorMessage="Email is a required field")]
        public string Email { get; set; }

        [Required(ErrorMessage="Address is a required field")]
        public Address Address { get; set; }

        public Pool Pool { get; set; }

        [Required(ErrorMessage = "Category is a required field")]
        public Category Category { get; set; }

        public ICollection<MatchParticipant> matchParticipants { get; set; }
    }

        var matches =
        context.matches
       .Include("Official")
       .Include("Slot")
       .Include("MatchParticipants.Team")
       .Include("Category.Tournament")
       .Where(m => m.Category.Tournament.TournamentId == tournamentId)
       .GroupBy(m => m.Category);
Run Code Online (Sandbox Code Playgroud)

如何让Include工作?

Lad*_*nka 44

Include要求查询的形状不会改变.这意味着您的查询必须返回IQueryable<Match>.GroupBy运算符可能被认为是形状改变因为它返回IQueryable<IGrouping<TKey, TSource>>.一旦查询的形状改变,所有Include语句都被省略.因此,您不能使用Include投影,自定义连接和分组.

作为一种解决方法,您可以在Linq-to-objects中执行分组:

var matches = context.matches
                     .Include("Official")
                     .Include("Slot")
                     .Include("MatchParticipants.Team")
                     .Include("Category.Tournament")
                     .Where(m => m.Category.Tournament.TournamentId == tournamentId)
                     .ToList()
                     .GroupBy(m => m.Category);
Run Code Online (Sandbox Code Playgroud)

编辑:正如评论和其他答案中所述,这是非常危险的解决方法,可能导致性能问题.它将所有记录从数据库提取到应用程序,并在应用程序中进行聚合.它可以在相同的情况下工作,但绝对不适用于通用解决方案.

  • 当你必须将你的对象类型保持为IQueryable <>时,还有任何进一步的建议吗? (3认同)
  • 此查询未优化,因为它首先从数据库获取所有行,然后在 LINQ to Objects 中“分组依据” (2认同)
  • @khosravi 你是对的。这是性能灾难的方式。很惭愧,我曾经在没有很清楚的情况下提出了这个解决方案。 (2认同)

Tom*_*ino 27

在这种特殊情况下,当你的GroupBy是最新的运算符时,这个查询效果很好......但是上面的恕我直言答案对于beginer来说是最糟糕的答案,因为当你的GroupBy没有在它之后执行时它会导致非常优化的查询,但是然后是其他一些陈述(Where,Select ...).

var ctx = new MyDataContext(); // Please use "using"
var result = ctx.SomeTable
                //.Include(ah => ah.IncludedTable) // DO NOT PUT IT HERE
                .Where(t => t.IsWhateverTrue)
                .GroupBy(t => t.MyGroupingKey)
                .Select(gt => 
                    gt.OrderByDescending(d => d.SomeProperty)
                        .FirstOrDefault(ah => ah.SomeAnotherFilter))
                .Include(ah => ah.IncludedTable) // YES, PUT IT HERE
                .ToList(); // Execute query here
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,结果不会只包含每组中的第一个吗?如何在组后包含,以便组中的所有元素保留在结果中? (5认同)
  • 不要忘记:使用System.Data.Entity; (4认同)