将此 sql 查询转换为 LINQ 查询
Conversion of this sql query to LINQ query
我想将此 sql 查询转换为 linq 查询。
SELECT
CreationUtcTime,
Speed,
convert((CreationUtcTime - LAG(CreationUtcTime) OVER (ORDER BY CreationUtcTime)), char) AS diff
FROM assetstatusrecords
WHERE
Speed <> 0.00 and
CreationUtcTime <= '2022-03-28' and
CreationUtcTime >= '2022-02-21' and
AssetId = '7556d50c-95e5-4cd5-a31d-b4d6c6ab1fb1'
ORDER BY CreationUtcTime
LINQ 的模型 Class
class AssetStatusRecord : Entity
{
protected AssetStatusRecord()
{
}
public AssetStatusRecord(CoordinatesValue coordinates, double speed,
LengthValue distanceTravelled, Guid sensorId, Guid? assetId,
int? heading, Guid readingId, DateTime? sensorDateTime)
{
Coordinates = coordinates;
Speed = speed;
DistanceTravelled = distanceTravelled;
SensorId = sensorId;
AssetId = assetId;
Heading = heading;
ReadingId = readingId;
SensorDateTime = sensorDateTime;
}
public CoordinatesValue Coordinates { get; private set; }
public double Speed { get; private set; }
public LengthValue DistanceTravelled { get; private set; }
public Guid SensorId { get; private set; }
public Guid? AssetId { get; private set; }
public int? Heading { get; private set; }
public Guid ReadingId { get; private set; }
public DateTime? SensorDateTime { get; private set; }
}
实体Class如下:-
public class Entity : IEntity
{
public Entity();
public Guid Id { get; protected set; }
public long SequentialId { get; protected set; }
public DateTime CreationUtcTime { get; protected set; }
public DateTime CreationLocalTime { get; protected set; }
}
和接口 IEntity :-
public interface IEntity
{
Guid Id { get; }
long SequentialId { get; }
DateTime CreationUtcTime { get; }
}
此模型class可用于执行我在评论中的以下查询中使用的 linq 查询
如果您使用的是 EF Core,则可以通过 linq2db.EntityFrameworkCore 扩展执行此类查询。请注意,我是创作者之一。
有了这个扩展,您可以在 LINQ 查询中使用 LAG
:
var query =
from s in context.AssetStatusRecord.ToLinqToDB() // switch LINQ Provider
where s.Speed != 0
&& s.CreationUtcTime <= endTime
&& s.CreationUtcTime >= startTime
&& s.AssetId == assetId
orderby s.CreationUtcTime
select new
{
s.CreationUtcTime,
s.Speed,
diff = s.CreationUtcTime -
Sql.Ext.Lag(s.CreationUtcTime)
.Over()
.OrderBy(s => s.CreationUtcTime)
.ToValue()
};
var result = query.ToList();
如果对于任意两条记录 A
和 B
使得 A.SequentialId < B.SequentialId
条件 A.CreationUtcTime <= B.CreationUtcTime
得到满足,那么没有 LAG
函数你可以做一些事情像这样:
DateTime dateFrom = DateTime.Parse("2022-02-21");
DateTime dateTo = DateTime.Parse("2022-03-28");
string assetId = "7556d50c-95e5-4cd5-a31d-b4d6c6ab1fb1";
var records =
from rec in context.AssetStatusRecords
where
rec.CreationUtcTime >= dateFrom &&
rec.CreationUtcTime <= dateTo &&
rec.Speed != 0 &&
rec.AssetId == assetId
select rec;
var query =
from rec1 in records
from rec2 in records.Where(r => rec1.SequentialId > r.SequentialId).DefaultIfEmpty()
group new { rec1, rec2 } by new { rec1.SequentialId, rec1.CreationUtcTime, rec1.Speed } into g
orderby g.Key.SequentialId
select new
{
g.Key.CreationUtcTime,
g.Key.Speed,
Diff = EF.Functions.DateDiffDay(g.Max(p => p.rec2.CreationUtcTime), g.Key.CreationUtcTime)
};
var results = query.ToList();
注意:以上代码适用于 Pomelo.EntityFrameworkCore.MySql 提供商。
我想将此 sql 查询转换为 linq 查询。
SELECT
CreationUtcTime,
Speed,
convert((CreationUtcTime - LAG(CreationUtcTime) OVER (ORDER BY CreationUtcTime)), char) AS diff
FROM assetstatusrecords
WHERE
Speed <> 0.00 and
CreationUtcTime <= '2022-03-28' and
CreationUtcTime >= '2022-02-21' and
AssetId = '7556d50c-95e5-4cd5-a31d-b4d6c6ab1fb1'
ORDER BY CreationUtcTime
LINQ 的模型 Class
class AssetStatusRecord : Entity
{
protected AssetStatusRecord()
{
}
public AssetStatusRecord(CoordinatesValue coordinates, double speed,
LengthValue distanceTravelled, Guid sensorId, Guid? assetId,
int? heading, Guid readingId, DateTime? sensorDateTime)
{
Coordinates = coordinates;
Speed = speed;
DistanceTravelled = distanceTravelled;
SensorId = sensorId;
AssetId = assetId;
Heading = heading;
ReadingId = readingId;
SensorDateTime = sensorDateTime;
}
public CoordinatesValue Coordinates { get; private set; }
public double Speed { get; private set; }
public LengthValue DistanceTravelled { get; private set; }
public Guid SensorId { get; private set; }
public Guid? AssetId { get; private set; }
public int? Heading { get; private set; }
public Guid ReadingId { get; private set; }
public DateTime? SensorDateTime { get; private set; }
}
实体Class如下:-
public class Entity : IEntity
{
public Entity();
public Guid Id { get; protected set; }
public long SequentialId { get; protected set; }
public DateTime CreationUtcTime { get; protected set; }
public DateTime CreationLocalTime { get; protected set; }
}
和接口 IEntity :-
public interface IEntity
{
Guid Id { get; }
long SequentialId { get; }
DateTime CreationUtcTime { get; }
}
此模型class可用于执行我在评论中的以下查询中使用的 linq 查询
如果您使用的是 EF Core,则可以通过 linq2db.EntityFrameworkCore 扩展执行此类查询。请注意,我是创作者之一。
有了这个扩展,您可以在 LINQ 查询中使用 LAG
:
var query =
from s in context.AssetStatusRecord.ToLinqToDB() // switch LINQ Provider
where s.Speed != 0
&& s.CreationUtcTime <= endTime
&& s.CreationUtcTime >= startTime
&& s.AssetId == assetId
orderby s.CreationUtcTime
select new
{
s.CreationUtcTime,
s.Speed,
diff = s.CreationUtcTime -
Sql.Ext.Lag(s.CreationUtcTime)
.Over()
.OrderBy(s => s.CreationUtcTime)
.ToValue()
};
var result = query.ToList();
如果对于任意两条记录 A
和 B
使得 A.SequentialId < B.SequentialId
条件 A.CreationUtcTime <= B.CreationUtcTime
得到满足,那么没有 LAG
函数你可以做一些事情像这样:
DateTime dateFrom = DateTime.Parse("2022-02-21");
DateTime dateTo = DateTime.Parse("2022-03-28");
string assetId = "7556d50c-95e5-4cd5-a31d-b4d6c6ab1fb1";
var records =
from rec in context.AssetStatusRecords
where
rec.CreationUtcTime >= dateFrom &&
rec.CreationUtcTime <= dateTo &&
rec.Speed != 0 &&
rec.AssetId == assetId
select rec;
var query =
from rec1 in records
from rec2 in records.Where(r => rec1.SequentialId > r.SequentialId).DefaultIfEmpty()
group new { rec1, rec2 } by new { rec1.SequentialId, rec1.CreationUtcTime, rec1.Speed } into g
orderby g.Key.SequentialId
select new
{
g.Key.CreationUtcTime,
g.Key.Speed,
Diff = EF.Functions.DateDiffDay(g.Max(p => p.rec2.CreationUtcTime), g.Key.CreationUtcTime)
};
var results = query.ToList();
注意:以上代码适用于 Pomelo.EntityFrameworkCore.MySql 提供商。