我想创建一个linq to sql查询,它将返回一个包含已过滤的子列表的对象列表。
这听起来很容易,但我不知道如何让它发挥作用
这里是返回我想要的SQL Query:
select * from Texts t inner join Translations tt on t.TranslationId = tt.Id
inner join Pages p on tt.Id = p.TranslationId and tt.NeutralText = p.TitleNeutralTextId
where t.LanguageId = 1
现在我必须用linq写这个。
到目前为止我所做的是:
var query = this.Queryable() // Page entity
.AsNoTracking()
.Include(x => x.TitleTranslation.Texts);
return (from m in query
from l in m.TitleTranslation.Texts
where m.TitleTranslation.Texts.Any(l => l.LanguageId == 1)
select m);
但它没有用,因为我得到了所有语言的子列表,而不是id#1的语言。
感谢您的帮助,
大卫
答案 0 :(得分:2)
您正在撰写查询的具体原因是什么?您可以使用EF的df %>% mutate_at( .vars1 = colnames(.)[grep("^t_", colnames(.)],
.vars2 = colnames(.)[grep("^p", colnames(.)],
.funs = calc.W( .vars1, .vars2 , area)
)
加载所有子表,或者在Linq语句下面可以获取所需的结果
Eager Loading
此处将 var result = texts.Join(translations, t => t.TranslationId, tt => tt.Id, (t, tt) => new {t, tt})
.Join(pages, ttt => new { Id = ttt.tt.Id, NeutralTextId = ttt.tt.NeutralText }, p => new { Id = p.TranslationId, NeutralTextId = p.TitleNeutralTextId }, (ttt, p) => new {ttt, p})
.Where(tttt => tttt.ttt.t.LanguageId == 1);
,texts
和translations
替换为实际的dbContext实体集合属性。
答案 1 :(得分:1)
我认为你必须尝试石灰。这对你有用。 这将类似于SQL查询
一种方法。
var result = from m in Texts
join Translations on Texts.TranslationId = Translation.Id
Join Pages on Translations.NeutralText = Pages.NeutralText
where Texts.LanguageId = 1
select m
还有另一种方法可以使用实体框架
var result =
this.Queryable().AsNoTracking().Include(x=>x.Translations).Where(x=>x.LanguageId= 1)
答案 2 :(得分:1)
我找到了我想要的解决方案,感谢Hasnain Bukhari。 解决方案是从文本表开始,分配过滤器,包含所需的实体(页面)并将结果放入内存( ToList())。然后选择页面。它会按照我必须的顺序给出我想要的结果。
var query = textService.Queryable()
.AsNoTracking()
.Include(x => x.Translation.Pages)
.Where(x => x.LanguageId == languageId).ToList();
return query.SelectMany(x => x.Translation.Pages);