2017-09-23 96 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,一切正常。

相關問題