繁体   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