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();
答案 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)
);