簡體   English   中英

使用列表的Linq過濾器<int>

[英]Linq filter using List<int>

我有一個帶有列的數據庫:Year(nvarchar),我想將此列的值添加到一個保管箱中,以降序排列。

這是我正在使用的代碼:

List<string>years = db.tbl1.Select(w => w.Year).Distinct().ToList();
years.reverse();
foreach (string year in years) { drop_years.Items.Add(year);}

這是行不通的,因為蜂鳴聲我會有類似這樣的內容:2012、2010、2009、2011等。

如果我使用:

List<int> years = db.tbl1.Select(w => w.Year).Distinct().ToList();

編譯器告訴我不能隱式將類型.. <字符串>轉換為.. <整數> ...

我是大個子,我不知道如何解決此問題。 請你幫助我好嗎?

我對此感到不安,但與我類似的話題並沒有幫助我弄清楚。

為了解決我的問題,我使用了一種非常不專業的方法:

    var years = db.tbl1.Select(w => w.Year).Distinct();
    List<int> yearsList = new List<int>();
    foreach (string year in years)
    { yearsList.Add(Convert.ToInt32(year)); }
    yearsList.Sort(); //I used Sort() because doesn't work only with Reverse();
    yearsList.Reverse();

但我知道這不是一個很好的解決方案。

預先感謝您的幫助!

您可以嘗試使用Select()方法並在int轉換Year(字符串)。 像這樣:

var years = db.tbl1.Select(w => w.Year).Distinct().ToList().Select(x => int.Parse(x));

它將對數據庫執行查詢,獲得一個dinstinc和year列,之后,它將在內存中(從linq到對象)轉換為IList<int> 在它之后, years將是一個IList<int>並且您可以對這種類型(或擴展名)使用Sort()和其他方法:

years = years.Sort();

您還可以使用OrderBy()方法對其進行排序並獲得一個新的List,作為示例:

years = years.OrderBy(y => y).ToList();

// or order descending
years = years.OrderByDescending(y => y).ToList();

當對數據庫使用LINQ時,您只能做些限制。 但是,如果您轉換為實體,則可以獲得更多的功能!

var years = db.tbl1
  .Select(y => y.Years)
  .Distinct()
  .ToList() // Forces the SQL query to execute and return your string list
  .Select(y => int.Parse(y.Years))
  .OrderByDescending(y => y);

這應該執行您的SQL,將字符串解析為整數(似乎從代碼示例中需要此字符串,如果不是,則不需要ToList和第二個Select),然后返回整數類型年份的降序列表。

基本上,針對SQL的查詢通常無法執行更強大的檢查,轉換等操作。此外, Select語句實際上用作優化SQL查詢以在所需字段上進行選擇的投影。 如果需要將結果集隱藏到業務對象中,則必須首先調用ToList()(或ToArray())以使查詢執行並返回結果。 此后的所有內容都是LinqToEntities,它更加靈活。 此時,您可以轉換對象,創建新對象等。

您需要做的只是將第一行更改為:

List<string>years = db.tbl1.Select(w => w.Year).Distinct().OrderBy(x=>x).ToList();

排序依據的添加將確保內容從數據庫中出來時進行排序,而您在其他情況下不會這樣做。

更整潔的是,您可以使用OrderByDescending ,然后忽略稍后要執行的Reverse

假設您的所有年份均為四位數,則可以對它們進行字符串排序。 僅當數字位數不同時,字符串排序數字(例如1、10、2、3)才會出現問題。 原因是,如果您的數字都是相同的數字,那么每個被比較的字符將具有相同的數量級(例如,成千上萬的數字將始終被比較)。

暫無
暫無

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

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