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

问题描述 投票:1回答:3

我使用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 ???)。请给我一个关于这一点的打击我很困惑。

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

谢谢你们的帮助!

linq entity-framework linq-to-entities
3个回答
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提供程序将为您提供连接。


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版本。


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 });
© www.soinside.com 2019 - 2024. All rights reserved.