2011-08-04 52 views
1

我已經LINQ查詢以下LINQ情況查詢行爲

var result = from myTypes in context.MyTypes 
where 
    ((myTypes .Prop1== "Test" ? 1 : 0) + 
    (myTypes .Prop2 == "Tester2" ? 1 : 0) + 
    (myTypes .Prop3 == "624642624000000000" ? 1 : 0) + 
    (myTypes .Prop4 == "TS166TH" ? 1 : 0) + 
    (myTypes .Prop5 == "1 Test Lane" ? 1 : 0)) >= 4 
    select new { 
    myTypes .Prop1, 
    myTypes .Prop2, 
    myTypes .Prop3, 
    myTypes .Prop4, 
    myTypes .Prop5, 
    myTypes .OtherProp, 
    myTypes .OtherTypeId 
}; 

result.ToList(); 

這將導致以下預期SQL這是我想達到

SELECT 
[Extent1].[Prop1] AS [Prop1], 
[Extent1].[Prop2] AS [Prop2], 
[Extent1].[Prop3] AS [Prop3], 
[Extent1].[Prop4] AS [Prop4], 
[Extent1].[Prop5] AS [Prop5], 
[Extent1].[OtherProp] AS [OtherProp], 
[Extent1].[OtherTypeId] AS [OtherTypeId], 

FROM [dbo].[MyType] AS [Extent1] 
WHERE ((CASE WHEN ('Test' = [Extent1].[Prop1]) THEN 1 ELSE 0 END) + (CASE WHEN ('Tester2' = [Extent1].[Prop2]) THEN 1 ELSE 0 END) + (CASE WHEN ('624642624000000000' = [Extent1].[Prop3]) THEN 1 ELSE 0 END) + (CASE WHEN ('TS166TH' = [Extent1].[Prop4]) THEN 1 ELSE 0 END) + (CASE WHEN ('1 Test Lane' = [Extent1].[Prop5]) THEN 1 ELSE 0 END)) >= 4 

但是我想返回的MyType什麼不是一個匿名類型,所以我寫了以下內容

var result = from myTypes in context.MyTypes 
where 
    ((myTypes .Prop1== "Test" ? 1 : 0) + 
    (myTypes .Prop2 == "Tester2" ? 1 : 0) + 
    (myTypes .Prop3 == "624642624000000000" ? 1 : 0) + 
    (myTypes .Prop4 == "TS166TH" ? 1 : 0) + 
    (myTypes .Prop5 == "1 Test Lane" ? 1 : 0)) >= 4 
    select myTypes; 

result.ToList(); 

我期望生成相同的查詢Ÿ但返回我的類型。相反,我發現它執行一個大規模的遞歸查詢(基本上查詢表中的每個記錄)如下。

SELECT 
[Extent1].[Prop1] AS [Prop1], 
[Extent1].[Prop2] AS [Prop2], 
[Extent1].[Prop3] AS [Prop3], 
[Extent1].[Prop4] AS [Prop4], 
[Extent1].[Prop5] AS [Prop5], 
[Extent1].[OtherProp] AS [OtherProp], 
[Extent1].[OtherTypeId] AS [OtherTypeId], 
FROM [dbo].[MyType] AS [Extent1] 
WHERE ((CASE WHEN ('Test' = [Extent1].[Prop1]) THEN 1 ELSE 0 END) + (CASE WHEN ('Tester2' = [Extent1].[Prop2]) THEN 1 ELSE 0 END) + (CASE WHEN ('624642624000000000' = [Extent1].[Prop3]) THEN 1 ELSE 0 END) + (CASE WHEN ('TS166TH' = [Extent1].[Prop4]) THEN 1 ELSE 0 END) + (CASE WHEN ('1 Test Lane' = [Extent1].[Prop5]) THEN 1 ELSE 0 END)) >= 4 
GO 

SELECT 
[Extent1].[OtherTypeId] AS [OtherTypeId], 
[Extent1].[OtherTypeProp] AS [OtherTypeProp], 
FROM [dbo].[OtherTypes] AS [Extent1] 
GO 

-- Region Parameters 
DECLARE EntityKeyValue1 BigInt = 1 
-- EndRegion 
SELECT 
[Extent1].[Prop1] AS [Prop1], 
[Extent1].[Prop3] AS [Prop2], 
[Extent1].[Prop3] AS [Prop3], 
[Extent1].[Prop4] AS [Prop4], 
[Extent1].[Prop5] AS [Prop5], 
[Extent1].[OtherProp] AS [OtherProp], 

WHERE [Extent1].[OtherTypeId] = @EntityKeyValue1 
GO 

-- Region Parameters 
DECLARE EntityKeyValue1 BigInt = 2 
-- EndRegion 
SELECT 
[Extent1].[Prop1] AS [Prop1], 
[Extent1].[Prop3] AS [Prop2], 
[Extent1].[Prop3] AS [Prop3], 
[Extent1].[Prop4] AS [Prop4], 
[Extent1].[Prop5] AS [Prop5], 
[Extent1].[OtherProp] AS [OtherProp], 

WHERE [Extent1].[OtherTypeId] = @EntityKeyValue1 
GO 

它看起來像是獲取所有的fk類型爲每個記錄和忽略where子句?

任何人都可以解釋我在這裏做錯了什麼,爲什麼兩個生​​成的查詢不同?

+0

後一個例子產生了什麼SQL? –

+0

你可以發佈''MyType''代碼嗎? –

+0

MyType只是一個實體類,其中有6個屬性(如示例中所示)。 – Sheff

回答

0

好那真是令人尷尬。

我正在使用LinqPad來測試查詢,並在ToList()結果上調用Dump()。 Dump()枚舉所有通過db中的所有相關記錄導致循環枚舉的屬性。作爲匿名類型轉儲的地方,只列出所有屬性,沒有實體導航屬性會導致枚舉。

所有在將來使用LinqPad的Dump()方法的實體的說明。爲了浪費時間向所有人道歉。學校男孩錯誤。