Почему мой лямбда-запрос возвращает анонимный тип по сравнению со строго типизированным возвращаемым значением Linq? - PullRequest
1 голос
/ 03 октября 2010

Хорошо, потерпите меня ... я не делал ни одного Linq или Lambda, пока пару дней назад:)

Я использую C # и ADO.NET Entity Framework.Я хочу запросить мою модель и получить список объектов на основе отношения.

Вот мой код:

var query = db.Achievements.Join
 (
 db.AchievementOrganisations,
 ach => ach.AchievementId,
 ao => ao.AchievementId,
 (ach, ao) => new { Achievement = ach }
 );

var query2 = from s in db.Achievements
 join h in db.AchievementOrganisations
 on s.AchievementId equals h.AchievementId
 select s;

(извините за форматирование)

Мойвопрос в том, почему первый запрос, который я считаю лямбда-выражением, возвращает анонимный тип:

{System.Data.Objects.ObjectQuery<<>f__AnonymousType1<MyApp.Models.Achievement>>}

... но во втором запросе (запрос LINQ) я получаю строго типизированное значение назад:

{System.Data.Objects.ObjectQuery<MyApp.Models.Achievement>}

Почему это?

Приветствия,

Бен

1 Ответ

8 голосов
/ 03 октября 2010

Этот бит является проблемой при первом вызове:

(ach, ao) => new { Achievement = ach }

Вы создаете новый анонимный тип со свойством Achievement типа Achievement.

Я подозреваю, что вы просто хотите:

(ach, ao) => ach

... хотя это немного странно делать соединение и игнорировать таблицу, к которой вы присоединяетесь.

По сути, всякий раз, когда вы видите new { ... }, это означает анонимный тип. (Не путать с new[] { ... }, который создает массив с предполагаемым типом элемента, или new List<string> { ... } и т. Д., Который будет создавать новый List<string> с данным содержимым.

...