簡體   English   中英

我如何使用linq並僅從數據表中選擇一個值的總和(字段)以及where子句?

[英]How do i use linq and select just a Sum of values(field) from a datatable along with a where clause?

X    Y      Z   E 
------------------
A   4.8     0   0 
B   1       0   0
C   8.52763 0   0

這就是我的數據表的外觀,

我想找到X列的值為B的Y列的值。

我正在嘗試使用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是具有上述數據的數據表。

有人可以告訴我代碼有什么問題嗎?

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

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

FirstOrDefault -通常是更快,它迭代,直到它找到元素,只需要遍歷整個枚舉,當它沒有找到它。 在許多情況下,找到項目的可能性很高。

SingleOrDefault -需要檢查,如果只有一個元素,因此總是遍歷整個枚舉。 確切地說,它會進行迭代,直到找到第二個元素並引發異常為止。

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

因此,您的數據源保留了一個對象集合,其中每個對象都具有屬性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.

列的類型可能會略有不同,但是思路保持不變。

我想找到X列的值為B的Y列的值。

由於這個問題,在我看來您對LINQ來說還很陌生。

在Linq中,只要您只想要源集合中的某些項目,就可以使用Where(...)

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”的項目。 所以,你Where將是:

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

每當您要將集合中的每個項目轉換為不同的對象時,請使用Linq Select:

.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 ,僅采用fetchedItem.X等於“ B”的那些元素。 從其余集合中,僅從每個元素獲取屬性Y的值。

簡單的漫畫卓悅! (一旦您知道該怎么做)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM