【发布时间】:2020-12-23 19:54:34
【问题描述】:
我在 SQL Server 中有一个用户定义的函数,它接受 TVP(表值参数)作为参数。在 EF 中,如何从 C# 调用这样的函数?
我尝试使用ObjectContext.CreateQuery<>的方法,但出现以下错误:
函数“QueryByParam”的参数“param”无效。参数只能是可以转换为 Edm 标量类型的类型。
还尝试了方法ObjectContext.ExecuteStoreQuery<> 并得到了同样的错误。无论如何它都不会返回IQueryable。
示例代码
[DbFunction(nameof(SampleDbContext), "QueryByParam")]
public IQueryable<SecurityQueryRow> QueryByParam(IEnumerable<ProfileType> profiles, bool isActive = false)
{
DataTable dataTable = ....
ObjectParameter profilesParam = new ObjectParameter("profileTypeIds", dataTable);
ObjectParameter isActiveParam = new ObjectParameter("isActive ", isActive);
return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<SecurityQueryRow>(
string.Format("[{0}].[{1}](@profileTypeIds, @isActive)", GetType().Name, "QueryByParam"),
profilesParam,
isActiveParam);
}
要求是我们需要一个 IQueryable 返回,而不是消费的结果。
【问题讨论】:
-
在正常情况下,我们会以 IQueryable 的形式返回。但是当输入参数为 Tvp 时它不起作用。对我们来说,输入参数是一个 tvp(例如;- IEnumerable
)。我们需要输出为 IQueryable。 -
@MikeJ,不相关。 Golda 正在询问表值函数的情况。
-
我认为简单的事实是
ObjectParameter永远不可能成为TVP。
标签: c# sql-server entity-framework entity-framework-6 table-valued-parameters