여러 SQL 테이블에서 레코드를 수집하는 linq 쿼리를 작성하려고합니다. 테이블과 그 관계는 아래 이미지에 나와 있습니다. 테이블에서 기본 및 외래 키를 통해 이미 설정된 관계는 검은 색 선으로 표시됩니다. 빨간색 선은 레코드를 필요한 항목으로 제한하기 위해 쿼리에만 필요한 관계를 나타냅니다.
다음은 linq 쿼리에 대한 최선의 시도이지만 예상대로 더 많은 레코드를 제공합니다 (관련되지 않은 레코드의 조합).
var query = from wastewater in db.WasteWaters
join allowance in db.Allowances on wasterwater.WasteWaterId equals allowance.WasteWaterId
join chemical in db.Chemicals on allowance.ChemicalId equals chemical.ChemicalId
join sample in db.Samples on wastewater.WasteWaterId equals sample.WasteWaterId
join analysissample in db.Analyses on sample.SampleId equals analysissample.SampleId
join analysisallowance in db.Analyses on allowance.ChemicalId equals analysisallowance.ChemicalId
select new QueryModel
{
WasteWaterName = wastewater.WasteWaterName,
SampleDescription = sample.SampleDescription,
Chemical = chemical.ChemicalName,
Result = analysis.AnalysisResult,
MaxAllowed = allowance.MaxAllowance
};
return query;
중요한 점은 '분석'테이블을 '샘플' 과 '허용'에 결합하는 것이라고 생각합니다 .
SQL로 내 db를 쿼리하면 (올바르게 수행해야 함) 결과가 linq 쿼리 결과와 다릅니다. 따라서 내 linq 쿼리에 문제가있는 것 같습니다. 해당 SQL 아래 :
SELECT WasteWaters.WastewaterName, Samples.SmplDescription, Chemicals.ChemicalName, Allowances.MaxAllowance, Analyses.Result
FROM ((Chemicals INNER JOIN (WasteWaters INNER JOIN Allowances ON WasteWaters.WasteWaterId = Allowances.WasteWaterId)
ON Chemicals.ChemicalId = Allowances.ChemicalId) INNER JOIN Samples ON WasteWaters.WasteWaterId = Samples.WasteWaterId)
INNER JOIN Analyses ON (Analyses.ChemicalId = Allowances.ChemicalId) AND (Samples.SampleId = Analyses.SampleId);
이 문제에 대한 도움을 주시면 감사하겠습니다.
이것이 당신을 위해 작동합니까?
var ans = from c in Chemicals
join a in Allowances on c.ChemicalId equals a.ChemicalId
join w in WasteWaters on a.WasteWaterId equals w.WasteWaterId
join s in Samples on w.WasteWaterId equals s.WasteWaterId
join a2 in Analyses on new { a.ChemicalId, s.SampleId } equals new { a2.ChemicalId, SampleId = a2.SampleId.Value }
select new QueryModel {
WasteWaterName = w.WasteWaterName,
SampleDesciption = s.SampleDescription,
Chemical = c.ChemicalName,
MaxAllowed = a.MaxAllowance,
Result = a2.Result
};
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다