2011-09-29 88 views
1

我使用EF 4和C#。将查询表​​达式转换为Linq方法的语法

我有这样一个查询:

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表达式重写Linq中。 我的问题:

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

注:可能是标题这个问题是不恰当的,让我知道我将提高你对这个帮助它

谢谢你们!

+0

你有重写的理由吗?还是只是为了学习更多关于LINQ的知识? – svick

+0

svick我想了解更多关于LINQ的信息,目前我的代码正在工作。 – GibboK

+0

官方名称似乎是[查询语法和方法语法](http://msdn.microsoft.com/en-us/library/bb397947.aspx)。 – svick

回答

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到实体与此无关。

无论如何,如果你正在使用LINQ到实体您CmsContent应该有Author财产和您的查询将减少到:

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

的LINQ到实体提供商将转换表达式树的时候加入了你到SQL查询。

+0

谢谢拉迪斯拉夫你的解释! – GibboK

+0

因此,LINQ-To-Entities意味着我可以检索使用MODEL(如此导航属性等)的数据。正确吗? thnks – GibboK

+1

LINQ-to-Entities表示您正在查询实体模型,LINQ提供程序正在将您的查询转换为SQL。 –

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

相关问题