Помогите: конвертировать команду sql в EF 4.1 Code First - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть эта схема:

enter image description here

... и я хочу выбрать несколько записей, используя этот запрос:

SELECT
    Articles.ArticleId,
    Articles.Title, 
    Articles.Tooltip, 
    Articles.UriTitle, 
    Articles.SubTitle, 
    Articles.Published,
    Tags.TagId
FROM Articles INNER JOIN
     ArticleTag ON Articles.ArticleId = ArticleTag.ArticleId INNER JOIN
         Tags ON ArticleTag.TagId = Tags.TagId
WHERE (Tags.TagId = @tagid) AND (Articles.Published = 1)

Может кто-нибудь помочь мнечтобы преобразовать этот запрос в EF 4.1 Code First (лямбда-выражение), пожалуйста?

ОБНОВЛЕНИЕ:

Я использую @ Ladislav Mrnka (каклямбда-выражение) и код работает!Теперь я поместил сгенерированный sql здесь и проверил, пожалуйста, чтобы убедиться, что нет проблем:

// C#:
var query = context.Articles.Where(a => a.Published && a.Tags.Any(t => t.TagId == tagId))
                            .Select(a = new {
                                a.ArticleId,
                                a.Title,
                                a.Tooltip,
                                a.UriTitle,
                                a.SubTitle,
                                a.Published
                            });

и сгенерированный sql

SELECT 
[Extent1].[ArticleId] AS [ArticleId], 
[Extent1].[Title] AS [Title], 
[Extent1].[Tooltip] AS [Tooltip], 
[Extent1].[UriTitle] AS [UriTitle], 
[Extent1].[SubTitle] AS [SubTitle], 
[Extent1].[Description] AS [Description], 
[Extent1].[Keywords] AS [Keywords], 
[Extent1].[MetaDescription] AS [MetaDescription], 
[Extent1].[CreatedAt] AS [CreatedAt], 
[Extent1].[UpdatedAt] AS [UpdatedAt], 
[Extent1].[Viewed] AS [Viewed], 
[Extent1].[Published] AS [Published], 
[Extent1].[Body] AS [Body]
FROM [dbo].[Articles] AS [Extent1]
WHERE ([Extent1].[Published] = 1) AND ( EXISTS (SELECT 
    1 AS [C1]
    FROM [dbo].[ArticleTag] AS [Extent2]
    WHERE ([Extent1].[ArticleId] = [Extent2].[ArticleId]) AND ([Extent2].[TagId] = @p__linq__0)
))

1 Ответ

1 голос
/ 19 сентября 2011

Попробуйте:

int tagId = ...;
var query = from a in context.Articles
            where a.Tags.Any(t => t.TagId == tagId) && a.Published 
            select new 
               {
                   a.ArticleId,
                   a.Title,
                   a.Tooltip,
                   a.UriTitle,
                   a.SubTitle,
                   a.Published,
                   tagId // I'm not sure if this will work but let give it a try  
               };

Если выбор TagId не работает, это не слишком большая проблема, потому что вы знаете, что все записи имеют одинаковый идентификатор тега.

...