0

如何按此 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 to Entities 查询中构造实体或复杂类型“彩票”。

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

4

1 回答 1

0

LINQ to SQL 和 LINQ to Entities - 与 LINQ to Objects 和 LINQ to Xml 不同 - 使用更高阶的方法来生成将在数据库上运行的 SQL,因此 lambda 表达式不具备该语言的全部功能。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对象。

于 2013-10-20T18:59:33.280 回答