我如何按Linq声明分组

时间:2013-10-20 18:43:12

标签: c# linq

如何通过此linq语句进行分组?

public IQueryable<Lottery> GetLotteriesByLotteryOfferId(int lotteryOfferId)
{
    return this.db.LotteryOffers
                                .Where(lo => lo.Id == lotteryOfferId)
                                .SelectMany(lo => lo.LotteryDrawDates)
                                .Select(ldd => ldd.Lottery);                                        
}

这不起作用:

public IQueryable<Lottery> GetLotteriesByLotteryOfferId(int lotteryOfferId)
{
    return this.db.LotteryOffers
                                .Where(lo => lo.Id == lotteryOfferId)
                                .SelectMany(lo => lo.LotteryDrawDates)
                                .Select(ldd => ldd.Lottery)
                                .GroupBy(s => new { s.Name, s.CreatedBy, s.ModifiedOn, s.Id })
                                .Select(g => new Lottery
                                                {
                                                    Name = g.Key.Name,
                                                    CreatedBy = g.Key.CreatedBy,
                                                    ModifiedOn = g.Key.ModifiedOn,
                                                    Id = g.Key.Id
                                                });
}

我得到的错误:

  

无法在LINQ中构建实体或复杂类型“彩票”   到实体查询。

我使用数据服务(网络服务)。

1 个答案:

答案 0 :(得分:0)

LINQ to SQL和LINQ to Entities - 与LINQ to Objects和LINQ to Xml不同 - 使用更高阶的方法生成将在数据库上运行的SQL,因此lambdas不具备该语言的全部功能。在Lottery“子句中创建新的Select”没有意义 - 您不想在数据库进程中创建那些Lottery对象,您希望在应用程序的进程中创建它们

您需要做的是使用AsEnumerable

 return this.db.LotteryOffers
                            .Where(lo => lo.Id == lotteryOfferId)
                            .SelectMany(lo => lo.LotteryDrawDates)
                            .Select(ldd => ldd.Lottery)
                            .GroupBy(s => new { s.Name, s.CreatedBy, s.ModifiedOn, s.Id })
                            .AsEnumerable()
                            .Select(g => new Lottery
                                            {
                                                Name = g.Key.Name,
                                                CreatedBy = g.Key.CreatedBy,
                                                ModifiedOn = g.Key.ModifiedOn,
                                                Id = g.Key.Id
                                            });

AsEnumerable之前的所有内容都会生成SQL。对AsEnumerable的调用迫使C#执行查询并将结果作为对象流获取 - Select现在可用于生成Lottery个对象。