#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 });