Преобразование выражения запроса в синтаксис метода Linq

#linq #entity-framework #linq-to-entities

#linq #entity-framework #linq-to-entities

Вопрос:

Я использую EF 4 и C #.

У меня есть запрос типа:

 var contentsAuthor = from c in context.CmsContents
                     join a in context.CmsAuthors on c.AuthorId equals a.AuthorId
                     where a.UserId == userGuid
                     select new
                     {
                         c.Title,
                         c.ContentId
                     };
  

Я хотел бы переписать его в Linq с помощью лямбда-выражения.
Мои вопросы:

  • Как его переписать?
  • Какое подходящее имя для моего синтаксиса запроса и нового с Linq и Lambda (выражение запроса и ссылка на объекты ???). Пожалуйста, дайте мне ответ на этот вопрос, я в замешательстве.

Примечания: возможно, название этого вопроса не подходит, дайте мне знать, я его улучшу

Спасибо, ребята, за вашу помощь в этом!

Комментарии:

1. У вас есть причина для перезаписи? Или это просто для того, чтобы узнать больше о LINQ?

2. svick Я хотел бы узнать больше о LINQ, на данный момент мой код работает.

3. Официальными названиями, по-видимому, являются синтаксис запроса и синтаксис метода .

Ответ №1:

Лямбда-выражение должно выглядеть следующим образом:

 var contentsAuthor = context.CmsContents
                            .Join(context.CmsAuthors, 
                                  content => content.AuthorId,
                                  author => author.AuthorId,
                                  (content,  author) => new { content, author })
                            .Where(x => x.author.UserId == userGuid)
                            .Select(x => new { x.content.Title, x.content.ContentId });
  

И ваша, и эта версия являются запросами LINQ. Этот использует лямбды напрямую, тогда как ваша версия использует синтаксический сахар, доступный в C #. Они одинаковы. LINQ-to-Entities не имеют к этому никакого отношения.

В любом случае, если вы используете LINQ-to-Entities, у вас CmsContent должно быть Author свойство, и ваш запрос будет сводиться к:

 var contentsAuthor = context.CmsContents
                            .Where(c => c.Author.UserId == userGuid)
                            .Select(c => new { c.Title, c.ContentId });
  

Поставщик LINQ-to-Entities выполнит соединение для вас при переводе дерева выражений в SQL-запрос.

Комментарии:

1. Спасибо Ладислав за ваше объяснение!

2. Таким образом, с помощью LINQ-To-Entities я могу повторно просматривать данные, работающие с МОДЕЛЬЮ (например, навигационные свойства и так далее).. правильно? спасибо

3. LINQ-to-Entities означает, что вы запрашиваете entity model, а поставщик LINQ преобразует ваши запросы в SQL.

Ответ №2:

Лямбда:

 var contentsAuthor = context.CmsContents
    .Join(context.CmsAuthors, c => c.AuthorId, a => a.AuthorId, (c, a) => new { Contents = c, Author = a })
    .Where(w => w.Author.UserId == userGuid)
    .Select(s => new { s.Contents.Title, s.Contents.ContentId });
  

Хотя то, как вы это сделали, прекрасно. Я называю это синтаксисом запроса, но я не уверен, есть ли у него официальное название.

Для такого рода вещей ознакомьтесь с LINQPad. В режиме «Выражение» вы можете ввести запрос, который у вас есть, и щелкнуть по символу лямбда, и он покажет вам лямбда-версию вашего запроса.

Ответ №3:

 var result = context.CmsContents
                        .Join(context.CmsAuthors.Where(x => x.auth.UserId == userGuid),
                         content => content.AuthorId,
                         author => author.AuthorId,
                         (cont, auth) => new { cont, auth })
                        .Select(x => new { x.cont.Title, x.cont.ContentId });