【发布时间】:2020-12-13 10:35:41
【问题描述】:
根据这里人们的建议,我正在尝试使用导航属性重写下面的 linq 查询。
我还没有走多远,因为我不确定如何用导航属性替换我的 Linq 查询中的联接。
到目前为止,我有这个:
await _context.StarList(sl => new
{
sl.StarId,
sl.StarType,
sl.StarTitle,
sl.ChemicalId...
}
但是,在原始查询中,我开始在查询中使用“化学原子”。
所以我不确定如何过渡到他们。
所以我的问题是,如何将原始查询中的联接替换为导航属性?
谢谢!
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;
【问题讨论】:
-
你试过用
Include()代替join吗? -
@ArsenKhachaturyan 嗨,Linq 查询中会出现这种情况吗?
-
更多信息请查看this帖子。
-
@ArsenKhachaturyan 所以不要像这样“加入”:
from starlist in _context.StarList join ql in _context.ChemicalList,我会用_context.StartList.Include("_context.ChemicalList")替换它?谢谢! -
是的,就是这样,它会节省你的时间:)
标签: c# .net linq entity-framework-core