2013-09-23 30 views
0

表演:EF 5進行LEFT OUTER JOIN不必要的簡單選擇

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

結果在這個SQL查詢,爲什麼是一個連接正在執行?我沒有說根本就無法查詢產品表,並且它導致我有重複數據的問題。我從來沒有見過這種行爲。

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

這是我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查詢,必須有某種時髦的推理在後臺進行。我仍然想知道是否有人對此有任何想法。

+1

我想你的導航屬性'產品'在你的'AssessmentItem'中 –

+0

只有一個單獨的'虛擬​​產品'哈姆雷特,添加了代碼示例 – GONeale

回答

0

DbSet.All通常用於測試序列的項是否滿足特定的謂詞..在您的情況下,您沒有提供任何謂詞,並且它似乎在做一個急切的加載。

在你的情況下,它需要一個Func<AssessmentItem, bool>作謂語

如果您只是想所有的項目,爲什麼不能簡單地說。

DB.AssessmentItems; 
+0

這不是那麼容易,因爲這是爲簡單起見而減少的,但它實際上運行通過一個通用的數據層,其中一個表達式可以通過。我已經做了一個更新的問題,一個小勝。 – GONeale

+1

@GONeale我不知道你爲什麼使用DB.All ..請你能解釋一下,目前你只是把它投影到一個select。是所有你定義的擴展方法或者通用的Linq All擴展方法嗎? – scartag

+0

好吧,對不起,這只是我發現轉換我的更長時間的最快方式我有一個EF連接的'repository'接口,名爲SiteEFSession,我有這個方法: 'public IQueryable All (Expression > expression)其中T:class {return _context.Set ().Where(expression).AsQueryable(); }',所以你可以做一些像'session.All ()'的東西,它會返回所有的項目。或'session.All (x => x.ID> 5)'返回所有ID> 5的地方。等等。 – GONeale

1

好,我發現了什麼混賬的問題是,它似乎我不得不設置AssessmentItem<>Product關係,在EF一個1-1的關係。作爲此產品的副產品,產品表中沒有任何AssessmentItemID INT外鍵,因爲刪除它是我遵循的說明建議的,如果不刪除它,它將無法正常工作,這似乎是問題所在,因爲當我去爲了保存迄今爲止我還沒有完成的Product記錄,它抱怨失蹤的FK。兩個問題都是相關的,重新將產品表添加到EF設計器表面修復了它。

感謝球員們對我的耐心等待。我真的認爲EF應該更容易地執行1-1關係,我現在只需要在每次訪問時都簡單地執行.Single()。 :(