LINQ to Entities无法识别该方法

时间:2013-09-18 13:45:32

标签: c# linq entity-framework

您好我尝试在实体选择查询中调用存储过程。但我得到了错误。 首先,我检查一下外面的程序。

  var img = dc.get_User_Image(1).FirstOrDefault();  
  var Task = from tbl_Task tsk in dc.tbl_Task
             join tmp in dc.tbl_TaskAssignment 
             on tsk.TaskID equals tmp.TaskID into jointable
             from tmp in jointable.DefaultIfEmpty()
             join ct in dc.tbl_User on tmp.AssignTo equals ct.UserID
             where tsk.IsDeleted == false && tsk.TaskID == IntTaskID && 
             tmp.IsDeleted == false
             select new
             {
                TaskID = tsk.TaskID,
                TaskDesc = tsk.Remarks,
                TaskTitle = tsk.TaskTitle,
                TaskEmpName = tmp.tbl_User.tbl_Contact.FirstName_EN,
                TaskEmpID = tmp.AssignTo,
                profileImage = "",
                Priority = tsk.Priority,
                TaskCompletedPercentage = tmp.CompletedPercentage

              };

没有错误。得到了结果。但是将代码更改为:

 var Task = from tbl_Task tsk in dc.tbl_Task
            join tmp in dc.tbl_TaskAssignment on tsk.TaskID equals tmp.TaskID into jointable
            from tmp in jointable.DefaultIfEmpty()
            join ct in dc.tbl_User on tmp.AssignTo equals ct.UserID
            where tsk.IsDeleted == false && tsk.TaskID == IntTaskID && 
            tmp.IsDeleted == false

            select new
            {
               TaskID = tsk.TaskID,
               TaskDesc = tsk.Remarks,
               TaskTitle = tsk.TaskTitle,
               TaskEmpName = tmp.tbl_User.tbl_Contact.FirstName_EN,
               TaskEmpID = tmp.AssignTo,
               profileImage = dc.get_User_Image(tmp.AssignTo).FirstOrDefault(),
               Priority = tsk.Priority,
               TaskCompletedPercentage = tmp.CompletedPercentage
           };

收到错误

  

LINQ to Entities无法识别该方法   ' {System.Data.Objects.ObjectResult {1}} 1 [System.Int64])'方法,这个   方法无法转换为商店表达式。

" dc.get_User_Image"接受"用户ID" (Int)并返回图像路径(String)。 在第一个代码我检查功能,单独。它工作正常。 在选择Query iam中调用this-> " profileImage = dc.get_User_Image(tmp.AssignTo).FirstOrDefault()"。它抛出错误

我无法理解为什么? 请帮助。

2 个答案:

答案 0 :(得分:2)

我认为,

dc.get_User_Image(tmp.AssignTo)是一个实际的CLR方法,它包装对数据库中存储过程的访问;它本身并不是一个实际的存储过程。

实体框架无法将对任意方法的调用转换为SQL,因此错误消息。您需要实现查询(例如ToList())和然后在其上运行转换函数(Select new {...}),以便该函数可用。

答案 1 :(得分:1)

 var Task = (from tbl_Task tsk in dc.tbl_Task
        join tmp in dc.tbl_TaskAssignment on tsk.TaskID equals tmp.TaskID into jointable
        from tmp in jointable.DefaultIfEmpty()
        join ct in dc.tbl_User on tmp.AssignTo equals ct.UserID
        where tsk.IsDeleted == false && tsk.TaskID == IntTaskID && 
        tmp.IsDeleted == false

        select new
        {
           TaskID = tsk.TaskID,
           TaskDesc = tsk.Remarks,
           TaskTitle = tsk.TaskTitle,
           TaskEmpName = tmp.tbl_User.tbl_Contact.FirstName_EN,
           TaskEmpID = tmp.AssignTo,

           Priority = tsk.Priority,
           TaskCompletedPercentage = tmp.CompletedPercentage
       }).AsEnumerable().select(row=> new {
task = row,
profileImage = dc.get_User_Image(tmp.AssignTo).FirstOrDefault()

})