C# 存储过程返回列值的Linq语句
我有一个linq语句,它从表中获取几列,然后最后一列是从存储过程返回的值。存储过程返回一个C# 存储过程返回列值的Linq语句,c#,linq,entity-framework,entity-framework-6,C#,Linq,Entity Framework,Entity Framework 6,我有一个linq语句,它从表中获取几列,然后最后一列是从存储过程返回的值。存储过程返回一个varchar(max)值,因为它正在执行一些递归查找,并且可能非常长 对于下面的代码,我使用“CalculatedValueSproc”作为存储过程的名称,该存储过程正在填充一个名为“CalculatedValue”的变量,该变量只是一个字符串 var users = (from u in _db.Users where u.Deleted == false or
varchar(max)
值,因为它正在执行一些递归查找,并且可能非常长
对于下面的代码,我使用“CalculatedValueSproc”作为存储过程的名称,该存储过程正在填充一个名为“CalculatedValue”的变量,该变量只是一个字符串
var users =
(from u in _db.Users
where u.Deleted == false
orderby u.Name
select new User
{
Id = u.Id,
Name = u.Name,
CalculatedValue = _db.CalculatedValueSproc(u.Id),
}).ToList();
执行此操作时,会出现以下错误:
LINQ to Entities无法识别方法“System.Data.Entity.Core.Objects.ObjectResult1[System.String]CalculatedValueSproc(System.Nullable
1[System.Int32])”方法,此方法无法转换为存储表达式
不知道我哪里出了问题,但任何帮助都是非常感谢的。多谢各位
Robert它正在尝试将
CalculatedValue=\u db.CalculatedValueSproc(u.Id)
转换为SQL语句,但它无法。但您可以在它是物化列表而不是SQL语句之后调用它。执行ToList()
将触发SQL并获得结果,从而允许您根据记录调用存储过程
我添加的SELECT()
试试这个:
var users =
(from u in _db.Users
where u.Deleted == false
orderby u.Name).ToList().
Select( u => new User
{
Id = u.Id,
Name = u.Name,
CalculatedValue = _db.CalculatedValueSproc(u.Id),
});
这就像不能在一个sql查询中直接使用列值调用sp一样。
您可以按以下方式分离结果:
var users =
(from u in _db.Users
where u.Deleted == false
orderby u.Name
select new User
{
Id = u.Id,
Name = u.Name,
CalculatedValue = null,
}).ToList();
foreach (var user in users)
{
user.CalculatedValue = _db.CalculatedValueSproc(u.Id);
}
当我遇到这样的问题时,这些步骤帮助了我:
使用XML打开EDMX模型,找到函数并更改其属性,如下所示:
请注意,IsComposable属性设置为true,ReturnType属性是函数返回的类型,在您的情况下,它应该是varchar
保存EDMX文件并重新生成项目
将函数添加到dbContext文件:
public partial class YourEntities
{
[DbFunction("YourModel.Store", "CalculatedValueSproc")]
public string CalculatedValueSproc(int? Id)
{
throw new NotSupportedException("Direct calls are not supported.");
}
}
public virtual ObjectResult<Nullable<string>> CalculatedValueSproc(Nullable<int> Id)
{
var IdParameter = Id.HasValue ?
new ObjectParameter("Id", Id) :
new ObjectParameter("Id ", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable< string >>("CalculatedValueSproc", Id);
删除这些代码行(如果它们位于dbContext文件中):
公共虚拟对象结果CalculatedValueSproc(可为空的Id)
{
var IdParameter=Id.HasValue?
新的ObjectParameter(“Id”,Id):
新的ObjectParameter(“Id”,typeof(int));
返回((IObjectContextAdapter)this.ObjectContext.ExecuteFunction>(“CalculatedValueSproc”,Id);
}
如果要在查询中使用存储过程,可以使用exec