C# 具有匿名类型的linq案例查询行为

C# 具有匿名类型的linq案例查询行为,c#,sql,linq,case,anonymous-types,C#,Sql,Linq,Case,Anonymous Types,我有以下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) + (myTyp

我有以下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子句


有人能解释一下我在这里做错了什么,以及为什么生成的两个查询不同吗?

好的,这很尴尬

我使用LinqPad测试查询,并在
ToList()
结果上调用
Dump()
。Dump()枚举通过数据库中所有相关记录进行循环枚举的所有属性。其中,作为匿名类型的转储,只列出所有属性,没有实体导航属性导致枚举


今后在实体上使用LinqPad的Dump()方法的注意事项。为浪费时间向所有人道歉。学童错误

后一个示例生成了什么SQL?你能发布
MyType
code吗?MyType只是一个实体类,其中包含6个属性(见示例)。我更新了这个问题,所以你的意思是如果我选择了新的{myTypes},会发生什么。我将尝试“但是我想返回MyType而不是匿名类型”--然后简单地编写
newMyType{…}
而不是
new{…}