簡體   English   中英

Windows Phone的GroupBy等效項

[英]GroupBy equivalent for Windows Phone

我目前正在使用共享的可移植類庫創建Win8和Wp8應用程序。 我要做的第一件事就是獲得要約清單。

public class Offer
{
    string category;
    ....
}

這些提議中的每一個都有分配給它的有限數量的類別之一。 在我的Win8應用程序中,一旦獲得了要約列表,就可以按category對這些要約進行分組。

var groupedOffers = offers.Items.GroupBy(item => item.category).OrderBy(item => item.Key.ToString());

不幸的是,Wp8中沒有相同的功能,否則它並不明顯。 有人知道如何在不顯式遍歷和創建組的情況下實現同一目標嗎?

var group = from p in offers.Items                        
group p by p.category into g
                    select g

offers.Items = group.ToList<Item>()

希望這會幫助您或至少給您一些想法

確保班級頂部有“ using System.Linq”。

這可能是查詢提供者施加的限制。 嘗試這個:

var groupedOffers = offers.Items
      .GroupBy(item => item.category)
      .AsEnumerable()
      .OrderBy(item => item.Key.ToString());

或這個:

var groupedOffers = offers.Items
      .AsEnumerable()
      .GroupBy(item => item.category)
      .OrderBy(item => item.Key.ToString());

AsEnumerable()將導致查詢的其余部分作為Linq-to-Objects處理。 這可能會帶來負面的性能,IO和/或內存損失,但有時是必需的。 例如,假設您正在對SQL Server使用EF。

  1. var新生兒= Context.People.Where(x => x.DateOfBirth.CompareTo(today)== 0);
  2. var新生兒= Context.People.AsEnumerable()。其中​​(x => x.DateOfBirth.CompareTo(today)== 0);

第一個查詢將轉換為類似於“ SELECT * FROM People WHERE DateOfBirth ='2014-01-31'”的內容,第二個查詢將轉換為“ SELECT * FROM People”。 然后,LINQ將篩選整個人員,只產生DateOfBirth.CompareTo(today)== 0的結果。如果數據庫包含大量數據,並且生活在距離很遠的數據中心等,則意味着將整個流式傳輸。回答1個簡單查詢的數據集。 1將是更有效的b / c過濾將在源處進行,只有匹配的數據才會流回到您的.NET代碼。

如果沒有AsEnumerable,則由LINQ查詢提供程序來嘗試將LINQ表達式轉換為對您正在查詢的系統(SQL Server數據庫,MySQL,LDAP,WMI等)有意義的查詢。 一些查詢提供者和/或其底層系統對他們可以支持的查詢類型施加了限制。

作為一個可能無法很好地翻譯(並且需要AsEnumerable或ToArray)的示例,想象一下WHERE子句中的復雜表達式,查詢提供程序不容易翻譯。

var happyBirthday = Context.People.Where(x => x.DateOfBirth.Month == DateTime.Now.Month && x.DateOfBirth.Day == DateTime.Now.Day);

也許有一些提供程序會將這個表達式轉換成SQL,但是其他提供程序將拒絕它。 他們不知道如何轉換DateTime.Now.Month和DateTime.Now.Day,他們可能會在DateOfBirth字段的.Month和.Day查找中遇到麻煩。

暫無
暫無

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

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