0

実行:

using (var DB = new SiteEntities())
{
  var test = DB.All<AssessmentItem>();
}

この SQL クエリの結果、なぜ結合が実行されるのですか?! Products テーブルをクエリすることをまったく述べていないため、重複データの問題が発生しています。私はこの振る舞いを見たことがありません。

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Name] AS [Name], 
[Extent1].[Description] AS [Description], 
[Extent1].[Status] AS [Status], 
[Extent1].[UpdatedAt] AS [UpdatedAt], 
[Extent1].[CreatedAt] AS [CreatedAt], 
[Extent1].[Alias] AS [Alias], 
[Extent1].[ImageFileName] AS [ImageFileName], 
[Extent1].[ReplacementCost] AS [ReplacementCost], 
[Extent2].[ID] AS [ID1]
FROM  [dbo].[AssessmentItems] AS [Extent1]
LEFT OUTER JOIN [dbo].[Products] AS [Extent2] ON ([Extent2].[AssessmentItemID] IS NOT NULL) AND ([Extent1].[ID] = [Extent2].[AssessmentItemID])

これは、Entity Framework によって生成された私の AssessmentItem.cs です。

public partial class AssessmentItem
{
    public AssessmentItem()
    {
        this.AssessmentItemAttributeMappings = new HashSet<AssessmentItemAttributeMapping>();
        this.CustomerAssessmentItems = new HashSet<CustomerAssessmentItem>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public byte Status { get; set; }
    public Nullable<System.DateTime> UpdatedAt { get; set; }
    public System.DateTime CreatedAt { get; set; }
    public string Alias { get; set; }
    public string ImageFileName { get; set; }
    public Nullable<decimal> ReplacementCost { get; set; }

    public virtual ICollection<AssessmentItemAttributeMapping> AssessmentItemAttributeMappings { get; set; }
    public virtual ICollection<CustomerAssessmentItem> CustomerAssessmentItems { get; set; }
    public virtual Product Product { get; set; }
}

アップデート:

using (var DB = new SiteEntities())
{
  var test = DB.All<AssessmentItem>()
      .Select(x => new
        {
            x.ID,
            x.Name
        });
}

正しい SQL クエリを生成します。バックグラウンドである種のファンキーな推論が行われている必要があります。誰かが理由について何か考えを持っているかどうか、私はまだ知りたいです.

4

2 に答える 2