将查询表达式转换为Linq方法语法

时间:2011-09-29 10:53:00

标签: 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
                     };

我想用Lambda Expression在Linq中重写它。 我的问题:

  • 如何重写?
  • 我的查询语法的适当名称是什么,Linq和Lambda的新名称是什么(查询表达式和Linq to Entities ???)。请告诉我这一点我很困惑。

注意:可能这个问题的标题不合适,让我知道我会改进它

谢谢你们的帮助!

3 个答案:

答案 0 :(得分:3)

lambda表达式应如下所示:

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查询。这个直接使用lambdas而你的版本使用C#中提供的语法糖。他们是一样的。 LINQ-to-Entities与此无关。

无论如何,如果你使用LINQ到实体,你的CmsContent应该有Author属性,你的查询会减少到:

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

在将表达式树转换为SQL查询时,LINQ-to-Entities提供程序将为您提供连接。

答案 1 :(得分:0)

LAMBDA:

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。在“表达式”模式下,您可以像您一样键入查询,然后单击Lambda符号,它将显示查询的lambda版本。

答案 2 :(得分:0)

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