我在sql数据库中有一个标量函数,我想用linq调用实体上下文。
虽然我知道,你可以使用以下语法调用表函数。
[DbFunction("Context", "TableFunc")]
public virtual IQueryable<ModelEntity> TableFunc(int
Id)
{
var IdParam = new ObjectParameter("Id", typeof(int))
{
Value = Id
};
return (this as IObjectContextAdapter).ObjectContext
.CreateQuery<ModelEntity>(
"Context.TableFunc(@Id)",IdParam);
}
但是如果我在这个地方使用标量函数。
我收到错误&#34;未指定name参数&#34;
我的标量函数没有任何参数。
更新: 标量函数调用
[DbFunction("Context","GetValue")]
public virtual IQueryable<short> GetValue()
{
return (this as
IObjectContextAdapter).ObjectContext.CreateQuery<short>
("Context.GetValue()");
}
答案 0 :(得分:0)
我最近通过查看GitHub SourceCode以及该link找到了解决方案。 幸运的是,该方法非常简单,只是没有以易于阅读的方式进行编码,因此,我发现很难正确使用它。
public partial class MainDbContext : DbContext
{
//....
[DbFunction("CodeFirstDatabaseSchema", "IsAssignedIncludedInPickedRoles")]
public static bool IsAssignedIncludedInPickedRoles(string pickedRoles, string assignedRoles)
{
throw new NotSupportedException();
}
//.....
}
在使用“ CodeFirstDatabaseSchema”字符串本身的义务中出现了歧义,尽管这是文档的一部分,它引导您使用dbContext名称或包括dbContext的名称空间,但这些都不是 第二件事是无需在函数内部编写代码,只需在播种方法内部通过SqlCommand创建SQL函数,然后享受工作
var rslt = await ctx.AssignedInstitutions.Where(e => MainDbContext.IsAssignedIncludedInPickedRoles(e.Roles, "ARIOB")).ToListAsync();