如何解决用导航属性替换联接
根据这里人们的建议,我正在尝试使用导航属性重写下面的linq查询。
我还没走很远,因为我不确定如何用导航属性替换Linq查询中的联接。
到目前为止,我有这个:
await _context.StarList(sl => new
{
sl.StarId,sl.StarType,sl.StarTitle,sl.ChemicalId...
}
但是,在原始查询中,我开始在查询中使用“ chemicalatoms”。
所以我不确定如何过渡到他们。
所以我的问题是,如何用导航属性替换原始查询中的联接?
谢谢!
public async Task<ActionResult<object>> GetStarChemicalData(string starID)
{
var starChemicalData = await (from starlist in _context.StarList
join ql in _context.ChemicalList on starlist.ChemicalId equals ql.ChemicalId into stars
from chemicallist in stars.DefaultIfEmpty()
join qc in _context.ChemicalAtoms on chemicallist.ChemicalId equals qc.ChemicalId into chemicals
from chemicalatoms in chemicals.DefaultIfEmpty()
join nk in _context.StarLinks on chemicalatoms.AtomId equals nk.AtomId into links
from starlinks in links.DefaultIfEmpty()
where starlist.StarId == starID
select new
{
StarId = starlist.StarId,StarType = starlist.StarType,StarTitle = starlist.StarTitle,ChemicalId = starlist.ChemicalId,AtomId = (Guid?)chemicalatoms.AtomId,OrderId = chemicalatoms.OrderId,ChemicalText = chemicallist.ChemicalText,AtomText = chemicalatoms.AtomText,Wavelength = chemicalatoms.Wavelength,isRedShifted = (starlinks.AtomId != null && starlist.StarType == 1) ? 1
: (starlinks.AtomId == null && starlist.StarType == 1) ? 0
: (int?)null
})
.GroupBy(x => x.StarId)
.Select(g => new
{
StarId = g.FirstOrDefault().StarId,StarType = g.FirstOrDefault().StarType,StarTitle = g.FirstOrDefault().StarTitle,ChemicalId = g.FirstOrDefault().ChemicalId,ChemicalText = g.FirstOrDefault().ChemicalText,ChemicalAtoms = (g.FirstOrDefault().AtomId != null ? g.Select(x => new
{
AtomId = x.AtomId,OrderId = x.OrderId,AtomText = x.AtomText,Feedback = x.Wavelength,IsCorrect = x.isRedShifted
}) : null)
}).FirstOrDefaultAsync();
return starChemicalData;
解决方法
根据以上交流成功,我想我可以总结一下结果,在这里)) 所以,不要这样:
$('.testimonial_slider').owlCarousel({
loop:false,margin:32,nav:false,dots: true,items:1,mouseDrag: false,dotsData: true,});
我们可以拥有这个:
var starChemicalData = await (from starlist in _context.StarList
join ql in _context.ChemicalList on starlist.ChemicalId equals ql.ChemicalId into stars
from chemicallist in stars.DefaultIfEmpty()
join qc in _context.ChemicalAtoms on chemicallist.ChemicalId equals qc.ChemicalId into chemicals
from chemicalatoms in chemicals.DefaultIfEmpty()
join nk in _context.StarLinks on chemicalatoms.AtomId equals nk.AtomId into links
...
);
请注意,使用Include时最重要的是应在此处使用的数据库表之间适当地设置关系(主外键)。
另一个重要的事情是,如果您的PK⟶FK关系中的一个包含_context.StarList.Include(st => st.ChemicalList)
.Include(ca => ca.ChemicalAtoms) // or ThenInclude,based on your relations
.Include(sl => sl.StartLinks)
...
Select(r => new {...})
...
的值,而实际上不应该包含Include()
,则null
不会带来行结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。