33

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

インクルードを機能させるにはどうすればよいですか?

4

4 に答える 4

50

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

編集:コメントや他の回答で述べたように、これはパフォーマンスの問題を引き起こす可能性がある非常に危険な回避策です。データベースからアプリケーションにすべてのレコードをプルし、アプリで集計を行います。同じケースで機能しますが、一般的なソリューションとしては適用できません。

于 2012-05-13T18:24:30.383 に答える
1

.Select()、 の後にインクルードを指定しますGroupBy()。これにより、結果にそれらが含まれます。

var result = ctx.SomeTable
                .Where(t => t.IsWhateverTrue)
                .GroupBy(t => t.MyGroupingKey)
                .Select(g => new
                  {
                    Date = g.Key.Value,
                    Reservations = g.Select(m => new
                        {
                          m,
                          m.IncludedTable // this selects/includes the related table
                        })
                  }
                );
于 2021-03-18T09:14:21.497 に答える