C# 基于数据服务的LINQ group by

C# 基于数据服务的LINQ group by,c#,sql,linq,entity-framework,lambda,C#,Sql,Linq,Entity Framework,Lambda,我的第一个问题是: 我使用服务器端的数据服务从客户端的数据库检索数据。我知道数据服务不支持分组 客户电话: public List<Lottery> GetLotteriesByLotteryOfferId(int lotteryOfferId) { var query = this.ClientRepositories.BackOfficeData.CreateQuery<Lottery>("GetLotteriesByLotteryOfferId")

我的第一个问题是:

我使用服务器端的数据服务从客户端的数据库检索数据。我知道数据服务不支持分组

客户电话:

public List<Lottery> GetLotteriesByLotteryOfferId(int lotteryOfferId)
{
    var query = this.ClientRepositories.BackOfficeData.CreateQuery<Lottery>("GetLotteriesByLotteryOfferId")
                    .AddQueryOption("lotteryOfferId", lotteryOfferId).ToList();

    return query;
}

我认为错误在于LINQ to实体无法投影到自定义类中,您应该能够通过在投影之前添加一个numerable来实现

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 })
                                .AsEnumerable()
                                .Select(g => new Lottery
                                                {
                                                    Name = g.Key.Name,
                                                    CreatedBy = g.Key.CreatedBy,
                                                    ModifiedOn = g.Key.ModifiedOn,
                                                    Id = g.Key.Id
                                                });
}
public IQueryable GetLotteriesByLotteryOfferId(int-lotteryOfferId)
{
返回此.db.LotteryOffers
.Where(lo=>lo.Id==lotteryOfferId)
.SelectMany(lo=>Lot.LotteryDrawDates)
.Select(ldd=>ldd.lotking)
.GroupBy(s=>new{s.Name,s.CreatedBy,s.ModifiedOn,s.Id})
.可计算的()
.选择(g=>新彩票
{
Name=g.Key.Name,
CreatedBy=g.Key.CreatedBy,
ModifiedOn=g.Key.ModifiedOn,
Id=g.Key.Id
});
}

我还认为您对viewModel的理解是正确的。

我认为错误在于您在选择器中使用了类彩票。 LINQ to entity只能构造pur“数据传输对象”:只包含公共属性的类,带有普通的getter和setter,没有构造函数

class LotteryDTO
{
  public string Name { get; set; }
  public string CreatedBy { get; set; } 
  ...
}

IQueryable<LotteryDTO> result = db.LotteryOffers
                            .Where(...)
                            .SelectMany(...)
                            .Select(...)
                            .GroupBy(...)
                            .Select(g => new LotteryDTO {
                               Name = g.Key.Name,
                               CreatedBy = g.Key.CreatedBy,
                               ...    
                            });
class LotteryDTO
{
公共字符串名称{get;set;}
通过{get;set;}创建的公共字符串
...
}
IQueryable结果=db.LotteryOffers
.其中(…)
.SelectMany(…)
.选择(…)
.GroupBy(…)
.选择(g=>new LotteryDTO{
Name=g.Key.Name,
CreatedBy=g.Key.CreatedBy,
...    
});
您所说的“客户端”是什么意思?在我的客户端(webapp)中,我使用方法调用服务方法。我将服务方法调用到服务器端:)
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 })
                                .AsEnumerable()
                                .Select(g => new Lottery
                                                {
                                                    Name = g.Key.Name,
                                                    CreatedBy = g.Key.CreatedBy,
                                                    ModifiedOn = g.Key.ModifiedOn,
                                                    Id = g.Key.Id
                                                });
}
class LotteryDTO
{
  public string Name { get; set; }
  public string CreatedBy { get; set; } 
  ...
}

IQueryable<LotteryDTO> result = db.LotteryOffers
                            .Where(...)
                            .SelectMany(...)
                            .Select(...)
                            .GroupBy(...)
                            .Select(g => new LotteryDTO {
                               Name = g.Key.Name,
                               CreatedBy = g.Key.CreatedBy,
                               ...    
                            });