2017-09-23 98 views
1

我写这个SQL查询LINQ到实体无法识别方法“的Int32 ToInt32(System.Object的)”方法

select 
    acc.DepartmentID, 
    dept.DepartmentName, 
    dept.DepartmentDivision, 
    county.CountyName, 
    sp.StateProvinceID 
from [AccountDepartmentXREF] acc 
inner join [Department] dept on dept.DepartmentID = acc.DepartmentID 
left join [DepartmentStateCountyXREF] dscx on dscx.DepartmentID = acc.DepartmentID 
left join [StateCounty] county on county.StateCountyID = dscx.StateCountyID 
inner join [StateProvince] sp on sp.StateProvinceID = dept.StateProvinceID 
where acc.AccountID = 1 

,并希望使用LINQ to改写它,但我总是感到困惑时写左联接在LINQ,所以我决定用一个转换器,并与Linqer去了,这是它产生

from acc in db.AccountDepartmentXREF 
join dscx in db.DepartmentStateCountyXREF on acc.DepartmentID equals dscx.DepartmentID into dscx_join 
from dscx in dscx_join.DefaultIfEmpty() 
join county in db.StateCounty on new { StateCountyID = Convert.ToInt32(dscx.StateCountyID) } equals new { StateCountyID = county.StateCountyID } into county_join 
from county in county_join.DefaultIfEmpty() 
join sp in db.StateProvince on acc.Department.StateProvinceID equals sp.StateProvinceID 
where 
acc.AccountID == 1 
select new { 
acc.DepartmentID, 
acc.Department.DepartmentName, 
acc.Department.DepartmentDivision, 
CountyName = county.CountyName, 
sp.StateProvinceID 
} 

所以当我在代码中把一切融合在一起

public List<DepartmentList> GetDepartmentsByAccountID(string email) 
    { 
     HWC = new HWCEntities(); 
     List<DepartmentList> result = new List<DepartmentList>(); 

     int id = CurrentUserID(email); 

     List<AccountDepartmentXREF> adx = HWC.AccountDepartmentXREFs.Where(w => w.AccountID == id).ToList(); 

     foreach(var a in adx) 
     { 
      var query = from acc in HWC.AccountDepartmentXREFs 
         join dscx in HWC.DepartmentStateCountyXREFs on acc.DepartmentID equals dscx.DepartmentID into dscx_join 
         from dscx in dscx_join.DefaultIfEmpty()         
         join county in HWC.StateCounties on new { StateCountyID = Convert.ToInt32(dscx.StateCountyID) } equals new { StateCountyID = county.StateCountyID } into county_join 
         from county in county_join.DefaultIfEmpty() 
         join sp in HWC.StateProvinces on acc.Department.StateProvinceID equals sp.StateProvinceID 
         where 
          acc.AccountID == a.AccountID 
         select new 
         { 
          acc.DepartmentID, 
          acc.Department.DepartmentName, 
          acc.Department.DepartmentDivision, 
          CountyName = county.CountyName, 
          sp.StateProvinceID 
         }; 

      foreach(var b in query) 
      { 
       result.Add(new DepartmentList 
       { 
        DepartmentID = b.DepartmentID, 
        DepartmentName = b.DepartmentName, 
        StateProvinceID = b.StateProvinceID, 
        DivisionName = b.DepartmentDivision, 
        CountyName = b.CountyName 
       }); 
      } 
     } 

     return result; 
    } 

我得到的错误

LINQ实体无法识别方法“的Int32 ToInt32(System.Object的)”方法,和这种方法不能被翻译成表达商店。

的foreach(询问变种B)

任何想法是如何解决这一问题?我环顾四周,但其他解决方案,我发现不处理连接

+0

Google你的错误。第一页充满了解决方案。 – FCin

+0

@FCin,是的,已经做到了。我知道了,但是我有一个允许在其中一个表中有空位的列。第一页上的这些解决方案都没有发现这可能是问题所在。 – Chris

回答

0

Linq不支持在查询内Convert.ToInt32(dscx.StateCountyID)方法,因为这将需要转换为SQL执行上的D b。

我不确定两个表中的数据类型StateCountyID是什么,但您需要使用一些与SQL兼容的转换方法(如SqlFunctions.StringConvert())来获取它们的相同数据类型。

+0

如果我删除,那么我在该连接上得到一个错误关于连接子句中的一个表达式的类型是不正确的,然后在foreach中我得到一个错误不能操作类型'?'的变量。 – Chris

+0

它们都是整数 – Chris

+0

然后你不需要任何转换。您遇到类型转换错误的事实表明它们不是同一类型。一种解决方法是在SqlFunction中使用StringConvert。 –

0

将它们转换为字符串

from acc in HWC.AccountDepartmentXREFs 
         join dscx in HWC.DepartmentStateCountyXREFs on acc.DepartmentID equals dscx.DepartmentID into dscx_join 
         from dscx in dscx_join.DefaultIfEmpty()         
         join county in HWC.StateCounties on new { StateCountyID = dscx.StateCountyID.ToString() } equals new { StateCountyID = county.StateCountyID.ToString() } 

,或者使用下面:

dscx.StateCountyID equals SqlFunctions.Convert(county.StateCountyID) 
0

我想通了,为什么我得到这个错误。这是因为我在DepartmentStateCountyXREF表中使StateCountyID为空。一旦我从可空的状态更改StateCountyID列,然后删除Convert.ToInt32,一切正常。

相关问题