首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >联机数据服务的LINQ组

联机数据服务的LINQ组
EN

Stack Overflow用户
提问于 2013-10-20 10:48:22
回答 2查看 979关注 0票数 0

我的第一个问题是:Linq lambda expression many to many table select

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

呼叫客户端:

代码语言:javascript
复制
public List<Lottery> GetLotteriesByLotteryOfferId(int lotteryOfferId)
{
    var query = this.ClientRepositories.BackOfficeData.CreateQuery<Lottery>("GetLotteriesByLotteryOfferId")
                    .AddQueryOption("lotteryOfferId", lotteryOfferId).ToList();

    return query;
}

我在服务器端的lambda查询不起作用:

代码语言:javascript
复制
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实体查询中构造实体或复杂类型的“彩票”。

我能理解,因为我的团队。我的问题是如何在客户端实现这一点?因此,我在服务器端运行查询,直到彩票选择(没有分组部分)并在客户端逐个附加查询部分?

附加问题如果我想使用自定义视图模型,我只需在客户端创建它并选择" viewmodel“类型,而不是选择选项的彩票?

示例:

代码语言:javascript
复制
                                .Select(g => new CustomViewModel
                                                {
                                                    CountRows = g.Count()
                                                });
EN

回答 2

Stack Overflow用户

发布于 2014-01-16 22:57:14

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

代码语言:javascript
复制
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,
                               ...    
                            });
票数 1
EN

Stack Overflow用户

发布于 2013-10-20 18:54:47

我认为这个错误是LINQ实体无法将其投影到自定义类中,您应该能够在投影之前添加AsEnumerable。

代码语言:javascript
复制
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
                                                });
}

我也认为你对viewModel的理解是正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19476477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档