2012-05-13 15 views
19

में शामिल हैं matchparticipants काम नहीं कर रहे हैं। जब मैं डीबग करता हूं तो यह हमेशा नल कहता है। लेकिन जब मैंने ग्रुपबी को टिप्पणी में रखा तो यह ठीक काम करता है। मैं कोड-प्रथम के साथ इकाई फ्रेमवर्क 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); 

मैं कैसे काम शामिल कर सकते हैं?

उत्तर

38

Include मांग करता है कि क्वेरी का आकार बदल नहीं है। इसका मतलब है कि आपकी क्वेरी IQueryable<Match> वापस करनी होगी। GroupBy ऑपरेटर को आकार बदलने के रूप में माना जाता है क्योंकि यह IQueryable<IGrouping<TKey, TSource>> देता है। एक बार क्वेरी के आकार में सभी परिवर्तन बयानों को बदल दिया जाता है। इसके कारण आप Include का अनुमान, कस्टम जॉइन और ग्रुपिंग के साथ उपयोग नहीं कर सकते हैं।

एक समाधान आप में समूहीकरण निष्पादित कर सकते हैं के रूप में Linq करने वाली वस्तुओं:

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

धन्यवाद आदमी यह ठीक काम करता है :) – Bart

+3

जब आप अपने ऑब्जेक्ट प्रकार को IQueryable <> के रूप में रखना चाहते हैं तो कोई और सुझाव? –

18

इस विशेष मामले में, जब अपने GroupBy नवीनतम ऑपरेटर है, इस प्रश्न के अच्छा काम करता है ... लेकिन IMHO ऊपर जवाब शुरुआती के लिए सबसे बुरा जवाब है, क्योंकि यह वास्तव में बुरी तरह से अनुकूलित क्वेरी का कारण बनता है जब आपका समूहबी इसके ठीक बाद निष्पादित नहीं होता है, लेकिन उसके बाद कुछ अन्य कथन (कहां, चुनें ...) होता है।

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

यह संकलित नहीं करता है, IENumerable में – Smithy

+3

शामिल करने की परिभाषा नहीं है: भूलें: System.Data.Entity का उपयोग करना; – Tomino

+1

मैं पुष्टि कर सकता हूं कि यह दृष्टिकोण काम करता है; यानी क्वेरी के अंत में शामिल करना। ध्यान दें कि इसमें शामिल होने से पहले एक अंतर जोड़ना आवश्यक हो सकता है। –

संबंधित मुद्दे