CREATE FUNCTION dbo.VehicleRepairstatus()RETURNS tableAS RETURN SELECT VehicleID,CurrentStatus FROM VehicleRepairHistory ...
我可以在查询中引用:
SELECT v.ID,v.name,r.CurrentStatusFROM Vehicle vleft OUTER JOIN dbo.VehicleRepairstatus() r on v.ID = r.VehicleID
我希望能够在linq查询中使用它:
var vehicles = await _databaseContext.Vehicles .Join() // join ITVF here? .Where(v => v.Type == 'Bus' ) .OrderBy(v => v.name) .ToAsyncList();
在某些时候,我可能会更改ITVF以包含一个参数:
CREATE FUNCTION dbo.VehicleRepairstatus(@ID AS INT)RETURNS tableASRETURN SELECT VehicleID,CurrentStatus FROM VehicleRepairHistory ... WHERE VehicleID = @ID
并称之为标量:
SELECT v.ID,(SELECT val FROM dbo.VehicleRepairstatus(v.ID)) AS CurrentStatusFROM Vehicle v
linq查询:
var vehicles = await _databaseContext.Vehicles .Select( ) // call ITVF here? .Where(v => v.Type == 'Bus' ) .OrderBy(v => v.name) .ToAsyncList();
两种方法都可以吗?
解决方法 是的,可以通过使用引入 query types的EF Core 2.1来实现.以下是必需的步骤:首先,创建一个类来保存TVF记录(使用正确的数据类型更新它):
public class VehicleRepairstatus{ public int VehicleID { get; set; } public int CurrentStatus { get; set; }}
然后在OnModelCreating中注册它:
modelBuilder.query<VehicleRepairstatus>();
然后使用query和Fromsql方法的组合从db上下文中公开它:
public Iqueryable<VehicleRepairstatus> VehicleRepairstatus(int ID) => query<VehicleRepairstatus>().Fromsql($"select * from VehicleRepairstatus({ID})");
就这样.
现在,您可以在liNQ查询中使用它,就像任何其他Iqueryable< T>一样.返回方法,例如:
from v in db.Vehiclesfrom r in db.VehicleRepairstatus(v.ID)select new { v.ID,r.CurrentStatus }
Fromsql方法中的“select”使其可组合,因此整个查询被转换为sql并执行服务器端.
更新:实际上,当用作相关子查询时,这不起作用,如上例所示(参见Reference to an ITVF raises a “second operation started on this context before a previous operation completed” exception).它只能在传递常量/变量参数时使用
from r in db.VehicleRepairstatus(123)...
请参阅链接中的后续帖子的答案,以便正确实施相关查询方案.
总结以上是内存溢出为你收集整理的c# – 在Linq和Entity Framework中使用内联表值函数全部内容,希望文章能够帮你解决c# – 在Linq和Entity Framework中使用内联表值函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)