Поведение запроса linq case с анонимными типами

У меня есть следующий запрос 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?

Может ли кто-нибудь объяснить, что я здесь делаю неправильно и почему два сгенерированных запроса разные?


person Sheff    schedule 04.08.2011    source источник
comment
Какой SQL выдает последний пример?   -  person Brian Dishaw    schedule 04.08.2011
comment
Можете ли вы опубликовать MyType код?   -  person Jacek Gorgoń    schedule 04.08.2011
comment
MyType — это просто класс сущностей с 6 свойствами (показанными в примере) внутри него.   -  person Sheff    schedule 05.08.2011
comment
Я обновил вопрос, так что вы имеете в виду, что произойдет, если я выберу новый {myTypes}. я буду стараться   -  person Sheff    schedule 05.08.2011
comment
Я получаю тот же результат. Кажется, он пытается получить типы FK для myType, но для ВСЕХ записей и игнорирует предложение where.   -  person Sheff    schedule 05.08.2011
comment
Однако я хочу вернуть MyType, а не анонимный тип -- Тогда просто напишите new MyType { … } вместо new { … }!   -  person stakx - no longer contributing    schedule 05.08.2011
comment
@stakx И очевидный момент. Я не думал просто инициализировать тип и устанавливать все реквизиты вручную   -  person Sheff    schedule 05.08.2011


Ответы (1)


ОК Это было неловко.

Я использовал LinqPad для проверки запроса и вызывал Dump() для результата ToList(). Dump() перечисляет все свойства, которые вызвали циклическое перечисление всех связанных записей в базе данных. Где в качестве дампа для анонимных типов просто перечислите все свойства, и никакие свойства навигации объекта не вызывают перечисление.

Примечание для всех, кто в будущем будет использовать метод LinqPad Dump() для Entity. Извиняюсь перед всеми за потраченное время. Ошибка школьника.

person Sheff    schedule 05.08.2011