【发布时间】:2017-08-07 00:07:38
【问题描述】:
我有一个名为 Engine(EngineId、Make、Model、SerialNumber 等)的数据库表和一个名为 Test(TestId、EngineId、TestDate、Value1、Value2 等)的表。我想选择每个引擎记录以及最新的测试结果(如果有,可能没有)。
我正在使用 ASP.NET Core 1.1 和 Entity Framework,并且我有 Engine 和 Test 模型实体。
我正在尝试将以下 SQL 转换为 LINQ 查询表达式:
SELECT e.*, t.Value1, t.Value2
FROM Engine e
LEFT JOIN Test t on e.EngineID = t.EngineID
AND t.TestDate= (SELECT MAX(TestDate) FROM Test t2)
我可以开始使用左连接,但我不知道如何执行子查询:
var engines = from e in _context.Engine
join t in _context.Test on e.EngineId equals t.EngineId into td
from c in td.DefaultIfEmpty()
select new EngineVM
{
EngineId = e.EngineId,
Unit = e.Unit,
Make = e.Make,
Model = e.Model,
SerialNumber = e.SerialNumber
};
这是我的视图模型:
public class EngineVM
{
public long EngineId { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public string SerialNumber { get; set; }
public decimal? LastTestValue1 { get; set; }
public decimal? LastTestValue2 { get; set; }
}
更新
解决方案如下:
var lastTestQuery = _context.Test
.FromSql(@"
SELECT t.* FROM Test t
WHERE t.TestDate = (SELECT MAX(t2.TestDate) FROM Test t2
WHERE t2.EngineId = t.EngineId)"
);
// Query to get engine records to display along with last test data
var engines = (from e in _context.Engine
orderby e.SerialNumber
join t in lastTestQuery on e.EngineId equals t.EngineId into lastEngineTest
from t in lastEngineTest.DefaultIfEmpty() // forces left join
let lastTest = (from x in lastEngineTest select x).FirstOrDefault()
select new EngineVM
{
EngineId = e.EngineId,
Unit = e.Unit,
Make = e.Make,
Model = e.Model,
SerialNumber = e.SerialNumber,
Status = CalculateEngineStatus(e.EngineId,
e.PermittedNox,
lastTest.Nox)
}).OrderByDescending(x => x.Status);
【问题讨论】:
-
查看 msdn 左外连接:code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
-
我查看了样本,但它们并没有真正帮助我
-
你是否有从引擎到测试的导航属性,即
engine.Tests。实际上...如果您至少为Engine和Test实体显示我们的部分对象模型会更好
标签: c# entity-framework linq linq-to-entities