2011-03-19 121 views
1

我面臨着簡單的LINQ查詢一個很大的問題..我用EF 4.0 .. 我試圖使用LINQ查詢以從表中的所有記錄:Linq查詢比SQL返回較少記錄查詢

var result = context.tablename.select(x=>x); 

這會導致比正常的sql查詢更少的行數select * from tablename;

這個表已經超過500臺的子對象(外鍵關係:一對一和一對多等)..

執行該LINQ語句之後,這一結果變量,所有子對象的值返回記錄,而不做一個包括聲明..

我不知道是不是EF 4.0的默認行爲..

我試過also..but有沒有用在linqpad本聲明

但有趣的是,如果我做與另一個表在同一個表上的聯接工作是一樣的是SQL內部聯接和計數是相同的..但我不知道爲什麼它只與該表的行爲不同

它是做內部聯接在返回該父表的所有記錄之前與所有子表聯繫?

請幫助我..

+0

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」),以精確地設置格式和語法突出顯示它! – 2011-03-19 10:05:41

+1

謝謝..我會在下次做.. – Sunny43 2011-03-19 20:31:37

回答

0

解決這類問題的最簡單的方法是看由ORM工具產生的生成的SQL。

如果您使用SQL Server,然後使用SQL Profiler查看生成的SQL。

從您所描述的情況來看,可能的解釋可能是您的實體之間的關係是強制性的,從而強制執行INNER連接而不是LEFT OUTER連接。

+0

「強制全外聯接」似乎是一個錯誤。你的意思是INNER加入嗎? – 2011-03-19 10:15:39

+0

@George Poleyvoy,你是對的,我相應地更新了我的答案。 – 2011-03-19 11:03:35

+0

我沒有在我的機器上的sql分析器,我無法檢查分析器結果現在..但我會在星期一更新我的結果..但我做了一個跟蹤使用Visual Studio 2010來檢查執行的SQL查詢LINQ查詢..但它與普通的SQL查詢相同,沒有任何與任何子表連接..有無論如何關閉子表加載選擇一個父表..感謝很多爲您的幫助.. – Sunny43 2011-03-19 19:59:53

0

這個表已經超過5桌爲 子對象(外鍵關係: 一對一和一對多等)..

執行 是LINQ語句返回記錄 後,此結果變量有沒有 所有子對象的值做一個包括聲明..

所以我們可能談論SSDL數據庫視圖或定製DefiningQuery。我說的the same behavior here。基於聯合表格的實體可能沒有每個重新排列的行的唯一標識,因此您的問題是標識映射。您必須手動配置實體的實體密鑰。它應該是基於來自連接表的所有主鍵的複合鍵。實體鍵用於識別indenty映射中的實體。如果您沒有每個記錄的唯一密鑰,則僅使用使用新密鑰的首次記錄。如果您沒有手動指定密鑰,那麼EF已經自行導入。

+0

所有的孩子表有它們自己的主鍵ID和一個與父表的主鍵相關的外鍵ID ..大多數關係是一對多的。 – Sunny43 2011-03-19 19:57:09

+0

你是如何創建'tablename'以及如何定義其關鍵字的?這是重要的部分。 – 2011-03-19 20:57:10

+1

我犯了一個愚蠢的錯誤..我發現我的連接字符串不同於我的DAL層對業務...這是我三天掙扎的結束..非常感謝.. – Sunny43 2011-03-22 14:53:51