c# – 在Linq和Entity Framework中使用内联表值函数

c# – 在Linq和Entity Framework中使用内联表值函数,第1张

概述我在SQL Server中创建了一个内联表值函数(ITVF),它返回一个值表(为了讨论的目的简化了查询): CREATE FUNCTION dbo.VehicleRepairStatus()RETURNS TABLEAS RETURN SELECT VehicleID, CurrentStatus FROM VehicleRepairHistory 我在sql Server中创建了一个内联表值函数(ITVF),它返回一个值表(为了讨论的目的简化了查询):

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中使用内联表值函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1215078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存