2015-04-14 65 views
0

我有這樣的搜索詞搜索十進制值

[HttpPost] 
public ActionResult Index(string searchString) 
{ 
    if (!String.IsNullOrEmpty(searchString)) 
    { 
     students = students.Where(s => s.FIRST_NAME.Contains(searchString) 
      || s.LAST_NAME.Contains(searchString) 
      || s.PERSONAL_NUMBER.Contains(searchString) 
      || s.ACD_UNI_DEGREES.DEGREE.Contains(searchString) 
      || s.ACD_UNI_FACULTIES.FACULTY.Contains(searchString) 
      || s.ACD_UNI_SPECIALIZATIONS.SPECIALIZATION.Contains(searchString) 
      || SqlFunctions.StringConvert(s.SEMESTER).Contains(searchString) 
      || s.COR_PAYER_STATUS.NAME.Contains(searchString) 
      || SqlFunctions.StringConvert(s.CREDIT_COUNT).Contains(searchString)); 
    } 

    return View(students.ToList()); 
} 

但調試它拋出一個異常:

System.NotSupportedException:指定的方法「System.String StringConvert(系統.Nullable`1 [System.Decimal])'類型 'System.Data.Objects.SqlClient.SqlFunctions'不能被轉換爲LINQ to Entities存儲表達式的 。

的問題是在這裏:

SqlFunctions.StringConvert(s.SEMESTER).Contains(searchString) 

學期是十進制和搜索字符串是字符串。 我該如何改進?

+0

做一個存儲過程,將十進制列轉換爲一個字符串,並在服務器上執行'like'比較。通過SqlClient調用存儲過程 – Ewan

+2

既然它可以爲空,你可以先檢查's.SEMESTER!= null && s.SESES.HasValue'然後'sEMESTER.Value.ToString()。Contains(searchString)' – Icepickle

+0

什麼樣的數據庫你有嗎? – Default

回答

1

您應該確保您使用的是System.Data.Entity.SqlServer.SqlFunctions。我rewrited你的查詢和一切工作正常。

0

雖然這是一個老問題發佈答案,這樣對方會做正確
首先要糾正是我們需要轉換的第一個整數爲十進制,然後搜索,假設數據類型搜索欄也十進制

所以首先轉換您的搜索字符串轉換爲十進制

   decimal dec; 
       bool IsDecimal = decimal.TryParse(searchString, out dec); 

       // Truncating search to 2 digits this should be equal to your db    
       // column precision so that rounding case are handled properly 
       decimal TruncateDigits = -1; 
       if (IsDecimal) 
        TruncateDigits = Convert.ToDecimal(Math.Truncate(dec * 100)/100); 

現在你的申請搜索與您分貝coloumn精密度並準備好搜索

students = students.Where(s => s.FIRST_NAME.Contains(searchString) 
      || s.LAST_NAME.Contains(searchString) 
      || s.PERSONAL_NUMBER.Contains(searchString) 
      || s.ACD_UNI_DEGREES.DEGREE.Contains(searchString) 
      || s.ACD_UNI_FACULTIES.FACULTY.Contains(searchString) 
      || s.ACD_UNI_SPECIALIZATIONS.SPECIALIZATION.Contains(searchString) 
      || (IsDecimal && (decimal.Round(s.SEMESTER, 2) == TruncateDigits)) 

重要的一點要注意

 (IsDecimal && (decimal.Round(s.SEMESTER, 2) == TruncateDigits)) 

在這裏我們再次將輪DB列的精度來處理舍入。

而且SqlFunctions.StringConvert會做四捨五入內部因此,如果您的號碼是db是68.88和你正在尋找68,它不會因爲搜索將StringConvert給你69(四捨五入),所以如果你要搜索68則需要使用功能
喜歡的東西

 SqlFunctions.StringConvert(decimal.Floor(s.SEMESTER)).Contains(searchString) 

希望這有助於!