2017-01-09 5 views
4

は私が働くこのSQLクエリを持って設定返しますこれをEFで使用するLinqクエリに変換しようとしています。SQL>はLINQのは、SQLに、SQLクエリは動作しますが、LINQ to SQLは、空のデータが

私は、空の結果セットを返す

var query = 
      from dbostats in _db.StatLines 
      join dbogames in _db.Games on dbostats.GameId equals dbogames.GameId 
      join dboseasons in _db.Seasons on dbogames.Season.SeasonId equals dboseasons.SeasonId 
      where dbostats.PlayerId == player.PlayerId 
      group dbostats.Points by dboseasons.Year into g 
      select new 
      { 
       Year = g.Key, 
       Points = g.Sum() 
      }; 

     playerAndStatLines.StatLinesBySeason = 
      query 
      .ToList() 
      .Select(r => new StatsBySeason 
       { 
        Season = r.Year, 
        Points = r.Points 
       }); 

を持っています。私はSQLの生成を表示すると

、それは予想通り、この

SELECT 
[GroupBy1].[K1] AS [Year], 
[GroupBy1].[A1] AS [C1] 
FROM (SELECT 
    [Extent3].[Year] AS [K1], 
    SUM([Extent1].[Points]) AS [A1] 
    FROM [dbo].[StatLines] AS [Extent1] 
    INNER JOIN [dbo].[Games] AS [Extent2] ON [Extent1].[GameId] = [Extent2].[GameId] 
    INNER JOIN [dbo].[Seasons] AS [Extent3] ON [Extent2].[Season_SeasonId] = [Extent3].[SeasonId] 
    WHERE ([Extent1].[Discriminator] IN (N'StatsBySeason',N'StatLines')) AND ([Extent1].[PlayerId] = 3) 
    GROUP BY [Extent3].[Year] 
) AS [GroupBy1] 

だ、私のDBに対して実行時に空の結果セットを返します。

問題は、このビットのようだ:

([Extent1].[Discriminator] IN (N'StatsBySeason',N'StatLines')) AND 

私はこれを取り出し、生成されたクエリを実行した場合、私は2016年、56の結果を取り戻します。

このExtent1.Discriminatorとは何ですか、それはなぜ私のlinqクエリから生成していますか?

私のモデルクラス:

public class PlayerAndStatLines 
    { 
     public PlayerWithTeam PlayerWithTeam { get; set; } 
     public IEnumerable<StatsBySeason> StatLinesBySeason { get; set; } 
    } 


public class Season 
    { 
     public int SeasonId { get; set; } 
     public int Year { get; set; } 
    } 


public class Game 
    { 
     public int GameId { get; set; } 
     public int HomeTeamId { get; set; } 
     public int AwayTeamId { get; set; } 
     public int HomeScore { get; set; } 
     public int AwayScore { get; set; } 
     public DateTime DatePlayed { get; set; } 
     public GameType GameType { get; set; } 
     public int? PlayoffGameNumber { get; set; } 
     public Season Season { get; set; } 
    } 

public class StatLines 
    { 
     public int StatLinesId { get; set; } 
     public int GameId { get; set; } 
     public int PlayerId { get; set; } 
     public int TeamId { get; set; } 
     public int Points { get; set; } 
     public int DefensiveRebounds { get; set; } 
     public int OffensiveRebounds { get; set; } 
     public int Assists { get; set; } 
     public int Turnovers { get; set; } 
     public int Minutes { get; set; } 
     public int Steals { get; set; } 
     public int Blocks { get; set; } 
     public int Fouls { get; set; } 
     public int ThreePointFieldGoalsAttempted { get; set; } 
     public int ThreePointFieldGoalsMade { get; set; } 
     public int TwoPointFieldGoalsAttempted { get; set; } 
     public int TwoPointFieldGoalsMade { get; set; } 
     public int FreeThrowsMade { get; set; } 
     public int FreeThrowsAttempted { get; set; } 
     public bool Started { get; set; } 
    } 


public class StatsBySeason : StatLines 
    { 
     public int Season { get; set; } 

     public string SeasonYears => Season + "/" + (Season + 1); 
    } 

私は、次のSQLを実行した場合:

select Discriminator from dbo.StatLines 

を、私は戻って2行を取得するには、両方の空。

ありがとうございます。

+3

Discriminatorは、モデルが継承階層を構成するときに、オブジェクトの具体的な型を保持するためにEntity Frameworkによって追加された列です。モデルクラスを質問に追加できますか? –

+0

あなたの 'StatsBySeason'クラスが' StatLines'エンティティを継承しているようですね。 –

+0

@Ivan Stoev - これは正しいです。モデルクラスをOPに追加します – Stuart

答えて

2

同じアセンブリ内でエンティティクラスを継承することは、可能な限り避けてください。 EFは派生クラスを検出して、TPH inheritance strategyを使用し、自動移行を使用している場合は暗黙的にDiscriminator列を作成して使用することを決定します。もちろん、既存のデータは空であり、クエリは中断されます。

私は2つのオプションを参照してください。封じ込めと継承を交換し

  • を:

    public class StatsBySeason 
    { 
        public int Season { get; set; } 
        public StatLines StatLines { get; set; } 
    
        public string SeasonYears => Season + "/" + (Season + 1); 
    } 
    
  • はEFが流暢な構成を使用してStatsBySeasonクラスを無視してみましょう:

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
        modelBuilder.Ignore<StatsBySeason>(); 
        // ... 
    } 
    

    やデータ注釈:

    [NotMapped] 
    public class StatsBySeason : StatLines 
    { 
        // ... 
    } 
    
+0

ありがとうございます、私はTPHの継承を認識していませんでした。あなたの解決策は、私が考える最初のものと一緒に行くでしょう:) – Stuart

+0

Gotcha gotcha gotcha。 – bbsimonbb