2015-05-21 139 views
0

我得到一個錯誤:無法隱式地從「字符串」到「布爾」轉換 sl.CustomerRefNbr是從我的表設計一個字符串不能把字符串轉換爲bool

using (AH_ODS_DBEntities db = new AH_ODS_DBEntities()) 
    { 
     string rs = db.Sales.Where(sl => sl.CustomerRefNbr); 

我曾嘗試:

bool rs = db.Sales.Where(sl => sl.CustomerRefNbr).ToString(); 
string rs = db.Sales.Where(sl => sl.CustomerRefNbr); 
Convert.ToBoolean(rs); 

我又是盲目的。 我試圖做的只是得到CustomerRefNbr列中的數據,並把它放在名單上。

+0

爲什麼你認爲它應該有一個默認轉換爲布爾值? – feetwet

+0

字符串如何可以隱式轉換爲布爾值? 'bool result =「cheese」'的結果是什麼? –

+1

也許他試圖將「true」和「false」轉換爲它們各自的布爾等值? –

回答

2

where子句需要一個布爾子句,並且您通過CustomerRefNbr給出了可能是字符串或數字值的內容。如果你想選擇所有這些值列表,就像你說的,使用選擇的LINQ方法: vars = db.Sales.Select(sl => sl.CustomerRefNbr).ToList();

0

您的代碼

string rs = db.Sales.Where(sl => sl.CustomerRefNbr); 

實際上並沒有什麼意義。您選擇的是客戶參考編號是..的銷售?然後將銷售清單分配給一個字符串?

它看起來有點像你想說的是你想要CustomerRefNbr作爲輸出,但是你不會說你想要哪一行的值。

你關於設法字符串爲bool轉換錯誤的原因是因爲Where期待返回一個布爾表達式。布爾值爲true的行將包含在結果中。它試圖解釋sl.CustomerRefNbr爲布爾和失敗。

即使它的工作,其結果必然是Sale對象的集合,而不是一個字符串,那麼你會得到另一個錯誤。

您需要使用Where指定所需的行,以及使用Select指定所需的列。

例如:

string rs = db.Sales.Where(sl => sl.Id == 123).Select(sl => sl.CustomerRefdNbr).First(); 

注意,Where的部分是,返回布爾值的表達式。

由於結果仍然是一個集合(即使您知道只有一個結果),您必須致電First才能將第一個結果合併到一個單獨的string中。

如果你想所有CustomerRefNbr值,那麼你就可以離開了Where

List<string> refs = db.Sales.Select(sl => sl.CustomerRefNbr).ToList(); 
0

這是更好地保存「銷售」與布爾財產或至少爲INT。 但無論如何,你的任務下一個解決方案有助於避免解析錯誤。

var res = db.Sales.Where(x =>x.CustomerRefNbr!= null && x.CustomerRefNbr.ToUpper()=="TRUE"); 
0

有夫婦在你的代碼錯誤:

  1. 此代碼 - string rs = db.Sales.Where(sl => sl.CustomerRefNbr); 會導致在IEnumerable<string>中,假設CustomerRefNbr是一個字符串或任何相關類型的IEnumerable,這就是您如何收集它的方法,但不能在string rs中執行此操作。你也需要使用Select, Where需要一個比較,你正在做的沒有

  2. 這是不正確 - bool rs = db.Sales.Where(sl => sl.CustomerRefNbr).ToString();您在布爾型填充串,在那裏再次在內部爲您提供了一個IEnumerable類型的ToString()之前。同樣,這WIL也有選擇工作,因爲那裏需要一個比較

我的假設是CustomerRefNbr是一個字符串或整數,現在你要做的是:

IEnumerbale<bool> lst = db.Sales.Where(sl => sl.CustomerRefNbr != null) .Select(Convert.ToBoolean(sl.CustomerRefNbr));

重要的一點這裏是CustomerRefNbr的值可以是string =「True」或「False」(無論如何),沒有別的,或者它的FormatException。對於整數,它可以是任何值,但只有值爲0纔會導致false,所有其餘都將爲true。

現在您可以使用布爾集合lst來獲取您需要的任何值,如First(),這是一個IEnumerbale擴展方法。還要記住,如果你正在做的DataTable的數據校驗,那麼你需要檢查,而不是零,這是上面做的DBNull,有一個在爲DBNull和.Net空的差異

0

db.Sales.Where(sl => sl.CustomerRefNbr)結果在編譯時錯誤,因爲where預期predicate(返回true或false的東西),你不提供一個。

你可能想要的是Select而不是Wheredb.Sales.Select(sl => sl.CustomerRefNbr);這再次返回CustomerRefNbr(IEnumerable<string>)的集合不是一個單一值(string

勘定「收藏」到string類型的變量(「單」)值不compile錯誤意義和結果再次。

如果要從IEnumerable集合中獲得單個值,可以使用db.Sales.Select(sl => sl.CustomerRefNbr).First()。這會讓您在所有「銷售」中都獲得「CustomerRefNbr」First「銷售」。現在

,如果你要過濾的「銷售」與CustomerRefNbr,你可以先過濾where條款和select CustomerRefNbr。

db.Sales.Where(s1=>s1.CustomerRefNbr=="123").Select(s2 => s2.CustomerRefNbr).First(); 

現在,這給你一個First「CustomerRefNbr」了所有的銷售,其中CustomerRefNbr是「123」

我還是爲什麼要convert「CustomerRefNbr」到boolean不明白?