2011-01-25 42 views
1

我在嘗試使用LINQ調用字符串操作方法時遇到了令人沮喪的問題。我現在已經做了大量的搜索,並嘗試了各種方法來獲取下面標記爲'FAILS'的行。它目前引發異常。在linq-to-sql查詢中調用字符串操作方法的問題

有些事情我已經試過:

一)開始級聯關鍵的創造是在同一個查詢,沒有任何改變

二)非字符串字段轉換爲字符串(另一個完整的可以用.ToString不能在linq中工作的String.Concat和String.Format被嘗試過,在某些情況下工作正常,但是當您稍後嘗試引用該值時不會)

c)使用concat等等,而不是「+」把這些東西結合在一起。

正如您所看到的,它似乎相當寬容地將字符串附加到非字符串,但是當調用該方法時,而不是

有很多行,所以我不想將數據轉換爲列表/數組等,但如果這是唯一的選擇,那麼任何建議表示讚賞。

非常感謝! - 標記

var vouchers = from v in db.Vouchers 
        select new 
        { 
         v.Amount, 
         v.Due_Date, 
         v.Invoice_Date, 
         v.PO_CC, 
         v.Vendor_No_, 
         v.Invoice_No_, 
         invoiceNumeric = MFUtil.StripNonNumeric(v.Invoice_No_) 
        }; 


    var keyedvouchers = from vv in vouchers 
         select new 
         { 
          thekey = vv.Vendor_No_ + "Test", // works with normal string 
          thekey2 = vv.Amount + "Test", // works with decimal 
          thekey3 = vv.Invoice_Date + "Test", // works with date 
          thekey4 = vv.invoiceNumeric, // works 
          thekey5 = vv.invoiceNumeric + "Test" // FAILS 
         }; 

- 剝離字符的方法---

public static string StripNonNumeric(string str) 
    { 
     StringBuilder sb = new StringBuilder(); 
     foreach (char c in str) 
     { 
      // only append if its withing the acceptable boundaries 
      // strip special chars: if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') | || (c >= 'a' && c <= 'z') | c == '.' || c == '_') 

      // strip any nonnumeric chars 
      if (c >= '0' && c <= '9') 
       { 
       sb.Append(c); 
       } 
     } 
     return sb.ToString(); 
    } 

- Message--

System.InvalidOperationException了由用戶代碼 消息未處理異常=無法(voucher).Select(v => new <> f__AnonymousType0 7(Amount = v.Amount, Due_Date = v.Due_Date, Invoice_Date = v.Invoice_Date, PO_CC = v.PO_CC, Vendor_No_ = v.Vendor_No_, Invoice_No_ = v.Invoice_No_, invoiceNumeric = StripNonNumeric(v.Invoice_No_))).Select(vv => new <>f__AnonymousType1 5(thekey =(vv.Vendor_No_ +「Test」),thekey2 =(Convert(vv.Amount)+「Test」),key3 = Convert(vv.Invoice_Date)+「Test」),key4 = vv.invoiceNumeric, thekey5 =(vv.invoiceNumeric +「Test」)))'到SQL中,並且不能將其視爲本地表達式。

回答

3

這是因爲它試圖構建表達式的SQL查詢,並且MFUtil.StripNonNumeric無法轉換爲SQL。

嘗試先返回它,然後將reult轉換爲列表,然後使用第二個查詢將其轉換。

var vouchers_temp = from v in db.Vouchers 
       select new 
       { 
        v.Amount, 
        v.Due_Date, 
        v.Invoice_Date, 
        v.PO_CC, 
        v.Vendor_No_, 
        v.Invoice_No_ 
       }; 


var vouchers = vouchers_temp.ToList().Select(new { 
        Amount, 
        Due_Date, 
        Invoice_Date, 
        PO_CC, 
        Vendor_No_, 
        Invoice_No_, 
        invoiceNumeric = MFUtil.StripNonNumeric(Invoice_No_) 
}); 
+0

非常好,謝謝你的建議,我會試試這個,並建議當我一天半回到這個數據庫附近時:) – Glinkot 2011-01-25 11:41:17

0

它無法工作,因爲它不是工作。

創建一個SQL函數並在查詢中調用它。

+0

謝謝。我不擅長編寫SQL函數,但感謝這個想法。 – Glinkot 2011-01-27 05:14:36