2011-08-04 46 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()方法的实体的说明。为了浪费时间向所有人道歉。学校男孩错误。