2011-03-15 100 views
1

Linq和EF4。如何将LINQ查询从查询​​语法转换为查询方法

我在查询语法中有这个Linq查询我想转换为查询方法。

你能做到吗?我想更多的THA2小时没有成功:-(

感谢您的时间

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

它的拼写语法** ** - 不是“sintax” ...... – 2011-03-15 12:44:04

+0

感谢marc_s您评论 – GibboK 2012-11-29 08:54:39

回答

1

这是一种非直接的翻译,我相信在执行少得多的代码相同的任务:

var myContentObj = context.CmsContents.Single(
         x => x.ContentId == myCurrentContentId && 
         x.CmsCategories.Any(y => y.CategoryId == myCurrentCategoryId) 
        ); 
+0

嗨,它工作得很好,对我来说它非常可读!谢谢 – GibboK 2011-03-15 13:59:07

2

我原来的答复选择了错误的项目,它是更复杂一点比我有(其中安仁已发布)。这就是我认为是等效的查询和不过应该有更好的表现:

CmsContent myContentObj = 
    context.CmsContents 
      .Where(cnt => cnt.ContentId == myCurrentId 
         && cnt.CmsCategories 
          .Any(categoy => categoy.CategoryId == myCurrentCategoryId)) 
      .Single(); 
+0

嗨杰夫不工作错误错误不能隐式地将类型'CmsCategory'转换为'CmsContent' – GibboK 2011-03-15 12:52:08

+0

这是不正确的。 – Ani 2011-03-15 12:55:37

+0

@GibboK:啊,哎呀,忽略了被选中的内容。实际上它更像Ani所拥有的。 – 2011-03-15 12:56:19

1

这里的C#编译器实际上是怎么做的,与.net反射一些帮助,以验证:

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呼叫具有透明标识符(一个匿名型实例保持“父” cnt和“子” categoy)。 Where筛选器应用于匿名类型实例,然后我们再执行Select投影来获取“父”。 Single电话当然总是在查询表达式之外,所以它应该是显而易见的。

欲了解更多信息,我建议阅读Jon Skeet的文章How query expressions work