如何通过此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中构建实体或复杂类型“彩票” 到实体查询。
我使用数据服务(网络服务)。
答案 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
个对象。