2017-09-01 30 views
1
X Y  Z E 
------------------ 
A 4.8  0 0 
B 1  0 0 
C 8.52763 0 0 

這是怎麼我的數據表的外觀,如何使用linq並從數據表中選擇一個值(字段)和where子句?

我想找到列Y的值,其中列X的值是B.

我想上面代碼中使用LINQ,我我不擅長。

所以這是我想做到這一點,

Decimal TotalValue = (Decimal) 0.0; 


TotalValue = Convert.ToDecimal(dt.AsEnumerable() 
.Where(x => x.Field<string>("X").ToString()=="B") 
.Select(p => p.Field<string>("Y").ToString())); 

注:所有列X,Y,Z,E是數據類型的字符串。並且dt是具有上述數據的數據表。

有人能告訴我我的代碼有什麼問題嗎?

+0

而且,如果數據表中存在多於一個'B'的事件,是否有辦法將它們總和並將其分配給變量? –

回答

3

您將獲得XB的所有值。使用FirstOrDefault獲取第一個匹配的項目。

SingleOrDefault相比,存在一些性能問題。從SingleOrDefault() vs FirstOrDefault()

FirstOrDefault-通常更快,它會迭代直到它找到元素,並且只有當它找不到時才迭代整個枚舉。在很多情況下,找到一件物品的可能性很大。

SingleOrDefault-需要檢查是否只有一個元素,因此總是迭代整個枚舉。確切地說,它迭代直到找到第二個元素並引發異常。

TotalValue = Convert.ToDecimal(dt.AsEnumerable() 
    .Where(x => x.Field<string>("X").ToString()=="B") 
    .Select(p => p.Field<string>("Y").ToString()).FirstOrDefault()); 
+0

這對我來說很好,謝謝。但是如果在數據表中有多於一次的'B',是否有辦法將它們總和並將其分配給變量? –

+0

是的,你可以用'Sum'方法代替'FirstOrDefault'。 –

1

所以你的數據源保持對象的集合,其中每個對象都有屬性X/Y/Z/E.還是在數據庫方面,你有至少列XYZ E.

表你可能知道如何獲取這個集合的行。

class MyData 
{ 
    public string X {get; set;} 
    public decimal Y {get; set;} 
    public int Z {get; set;} 
    public int E {get; set;} 
} 

IEnumerable<MyData> fetchedData = FetchMyData(...); 
// this is where you get the data from the table which creates for instance 
// your example. 

您的列的類型可能略有不同,但這個想法保持不變。

我想找到列Y的值,其中列X的值是B.

因爲這個問題的,在我看來你是很新的LINQ。

在LINQ,當你從你的源收集想要的只是某些項目,您使用Where(...)

在x => F(x)將其中部分被稱爲lambda表達式。 x是源集合中元素的標識符。 F(x)是一個布爾表達式,用於決定是保留該元素還是將其丟棄。它類似於:

List<MyData> sourceCollection = FetchData(); 
List<MyData> resultCollection = new List<MyData>() 
foreach (MyData x in sourceCollection) 
{ 
    if (F(x)) 
     resultCollection.Add(x); // = Keep the item 
    // else Don't keep the it 
} 

在你的情況,你只想保留一個X值爲「B」的thos項目。所以,你的Where將是:

.Where(fetchedItem => fetchedItem.X == "B") 

每當你想每一個項目集合中變換成不同的對象,使用LINQ的選擇:

.Select(x => F(x)) 

這裏F(X)是一個函數,它的元素,並將其轉換爲輸出類型的對象。

它類似於:

var resultCollection = new List<...>() 
foreach (var item in sourceCollection) 
{ 
    var resultItem = F(item); 
    resultCollection.Add(resultItem); 
} 

你的情況:你只想要列Y.的選擇值爲:

.Select(fecthedItem => fetchedItem.Y); 

所以總的結果將是:

// All Y Where X Equals B: 
var allYWhereXEqualsB = fetchedData 
    .Where(fetchedItem => fetchedItem.X == "B") 
    .Select(fecthedItem => fetchedItem.Y); 

換句話說:從順序fetchedData中,只取那些帶有的元素210等於「B」。從剩餘的收集中,從每個元素只取得財產Y的價值。

簡單的紀念bonjour! (一旦你知道如何做到這一點)

相關問題