如何将LINQ查询从查询​​语法转换为查询方法

时间:2011-03-15 12:36:34

标签: linq linq-to-entities entity

Linq和EF4。

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

你能做到吗?我尝试了2个小时没有成功: - (

感谢您的时间

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

3 个答案:

答案 0 :(得分:2)

我的原始答案选择了错误的项目。它比我(Ani发布的)复杂一点。以下是我认为的等效查询,但应该表现得更好:

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

答案 1 :(得分:1)

以下是C#编译器实际执行的操作,并在.NET Reflector的帮助下验证:

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和'child'{ {1}})。 categoy过滤器应用于匿名类型实例,然后我们执行另一个Where投影以获取'父级'。 Select调用当然总是在“查询表达式之外”,所以应该很明显它是如何适应的。

有关更多信息,我建议阅读Jon Skeet的文章How query expressions work

答案 2 :(得分:1)

这是一个非直接的翻译,我相信在更少的代码中执行相同的任务:

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