Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储过程返回列值的Linq语句_C#_Linq_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 存储过程返回列值的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

我有一个linq语句,它从表中获取几列,然后最后一列是从存储过程返回的值。存储过程返回一个
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.ObjectResult
1[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);
  • }

  • 保存EDMX文件并重新生成项目


  • 如果要在查询中使用存储过程,可以使用exec