Как преобразовать запрос LINQ из синтаксиса запроса в метод запроса - PullRequest
1 голос
/ 15 марта 2011

Linq и EF4.

У меня есть этот запрос Linq в синтаксисе запроса, который я хотел бы преобразовать в метод запроса.

Вы можете это сделать? Я пробовал более 2 часов безуспешно: - (

Спасибо за ваше время

CmsContent myContentObj = (from cnt in context.CmsContents
                   from categoy in cnt.CmsCategories
                   where categoy.CategoryId == myCurrentCategoryId && cnt.ContentId == myCurrentContentId
                   select cnt).Single();

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

Мой оригинальный ответ выбрал не тот элемент. Это немного сложнее, чем то, что у меня было (которое Ани опубликовала). Вот что я считаю эквивалентным запросом, однако он должен работать лучше:

CmsContent myContentObj =
    context.CmsContents
           .Where(cnt => cnt.ContentId == myCurrentId
                      && cnt.CmsCategories
                            .Any(categoy => categoy.CategoryId == myCurrentCategoryId))
           .Single();
1 голос
/ 15 марта 2011

Вот не прямой перевод, который, я считаю, выполняет ту же задачу в гораздо меньшем количестве кода:

var myContentObj = context.CmsContents.Single(
                        x => x.ContentId == myCurrentContentId && 
                        x.CmsCategories.Any(y => y.CategoryId == myCurrentCategoryId)
                    );
1 голос
/ 15 марта 2011

Вот как на самом деле это делает компилятор C # с помощью .NET Reflector для проверки:

var myContentObj = context
                   .CmsContents  
                   .SelectMany(cnt => cnt.CmsCategories,
                               (cnt, categoy) => new { cnt, categoy })
                   .Where(a => a.categoy.CategoryId == myCurrentCategoryId
                            && a.cnt.ContentId == myCurrentContentId)
                   .Select(a => a.cnt)
                   .Single();

По существу, вложенные предложения from приводят к вызову SelectMany с прозрачным идентификатором (экземпляр анонимного типа, содержащий «parent» cnt и «child» categoy). Фильтр Where применяется к экземпляру анонимного типа, а затем мы делаем другую проекцию Select, чтобы вернуть «родителя». Вызов Single всегда был «вне» выражения запроса, конечно, поэтому должно быть очевидно, как оно вписывается.

Для получения дополнительной информации я предлагаю прочитать статью Джона Скита Как работают выражения запросов .

...