2012-05-13 45 views
19

bao gồm matchparticipants không hoạt động. Nó luôn luôn nói Null khi tôi gỡ lỗi. Nhưng khi tôi đặt GroupBy vào bình luận thì nó hoạt động tốt. Tôi đang sử dụng khung Entity 4.3.1 với mã đầu tiên.LINQ khi sử dụng GroupBy, Bao gồm không hoạt động

Đối tượng:

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); 

Làm thế nào tôi có thể làm cho Bao gồm công việc?

Trả lời

38

Include yêu cầu hình dạng của truy vấn không thay đổi. Điều đó có nghĩa là truy vấn của bạn phải trả lại IQueryable<Match>. Nhà điều hành GroupBy có thể được coi là thay đổi hình dạng vì nó trả về IQueryable<IGrouping<TKey, TSource>>. Khi hình dạng của truy vấn thay đổi, tất cả các câu lệnh Bao gồm đều bị bỏ qua. Do đó, bạn không thể sử dụng Include với các phép chiếu, tham gia tùy chỉnh và nhóm.

Là một workaround bạn có thể thực hiện phân nhóm trong LINQ-to-đối tượng:

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); 
+1

Cảm ơn người đàn ông nó hoạt động tốt ngay bây giờ :) – Bart

+3

Bất kỳ đề xuất nào khác về thời điểm bạn phải giữ loại đối tượng là IQueryable <>? –

18

Trong trường hợp đặc biệt này, khi groupby của bạn là các nhà điều hành mới nhất, truy vấn này làm việc tốt ... Nhưng IMHO câu trả lời trên là câu trả lời tồi tệ nhất cho người mới bắt đầu, bởi vì nó gây ra truy vấn được tối ưu hóa thực sự kém khi GroupBy của bạn không được thực thi ngay sau nó, nhưng theo sau là một số câu lệnh khác (Ở đâu, Chọn ...).

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 
+0

Điều này không biên dịch, IEnumerable không chứa định nghĩa cho Bao gồm – Smithy

+3

Đừng quên: using System.Data.Entity; – Tomino

+1

Tôi có thể xác nhận rằng phương pháp này hoạt động; tức là đưa phần bao vào cuối truy vấn. Lưu ý rằng có thể cần phải thêm Phân biệt trước khi đưa vào. –

Các vấn đề liên quan