2014-01-09 61 views
1

我檢查了很多有這個錯誤的帖子,但沒有發現這個問題。 (另外我是新來的升C是一個Java的開發)Linq指定的演員表無效

我得到一個例外,因爲

System.InvalidCastException被抓獲

table2.Field(」 MEME_CK「)下面的代碼片段。

有在表2 3K左右行,我不能找到一種方法,以避免錯誤的鑄件線table2.Field(「MEME_CK」)

數據可以是零,不存在的,有效的或無效。所以我嘗試在泛型參數cast上使用可爲空的運算符。還看到有可能代表不存在的值的DBNull類。

有沒有一種方法預處理列數據做「等於測試」或在下面的代碼加入過嗎? 即使使用可爲空類型後,我如何避免投射?

以下代碼基本上都聯接基於MEMBERID即MEME_CK或MemeCk的兩個數據表,並用CapHeadID,MemeCk等作爲字段創建新的對象。

var query = 


     (from table1 in searchResult.AsEnumerable() 
     join table2 in memberInfo.AsEnumerable() 
     on table1.Field<decimal?>("MemeCk") equals 
      table2.Field<decimal?>("MEME_CK") 
     select new 
     { 
       CapHeadID = table1.Field<decimal>("CapHeadID"), 

      MemeCk = table1.Field<decimal>("MemeCk"), 

      Suffix = table2.Field<decimal>("MEME_SFX"), 

      Suscriber = table2.Field<string>("SBSB_ID"), 

       BusinessArea = table2.Field<string>("TEAM"), 

      MemberName = table2.Field<string>("MemberName"), 

      WorkTypeName = table1.Field<string>("WrkName"), 

      SSN = table2.Field<string>("MEME_SSN"), 

      AssignedUser = table1.Field<string>("AssignedUser") 

     }).Distinct().OrderBy(a => (a.Suscriber.IsNotNil() ? 

a.Suscriber : "")).Take(3000); 
+1

這將是有益的,如果你可以解釋這段代碼的作用。似乎沒有必要地令人費解。 –

+0

對不起。我已經添加了上述代碼的描述。 – amit

+0

'MEME_CK'的底層SQL類型是什麼? –

回答

0

您使用AsEnumerable到查詢將從IQueryable的了......基本上,這意味着LINQ不會嘗試生成SQL代碼的加盟,以及加盟將在C#來完成。

考慮到這一點,你可以嘗試只是讓他們爲對象 - 這樣的:

from table1 in searchResult.AsEnumerable() 
    join table2 in memberInfo.AsEnumerable() 
    on table1.Field<object>("MemeCk") equals 
     table2.Field<object>("MEME_CK") 
    select new... 

我不知道是否會工作,但它可能會做

+0

感謝NUMBER(38,0),它沒有走過去的查詢,但得到的輸出爲「枚舉沒有結果」 – amit