【问题标题】:Create anonymous object via LINQ lambda from one result [duplicate]通过 LINQ lambda 从一个结果创建匿名对象 [重复]
【发布时间】:2017-08-02 13:19:15
【问题描述】:

我有以下问题

var resources = Db.RESOURCE_Resource
                .Include(i => i.RESOURCE_Value.Where(s => s.ApplicatieID == applicationId))
                .Include(i => i.RESOURCE_Category)
                .Where(w => missingCultureIds.All(a => w.RESOURCE_Value.All(an => an.CultureID != a))); 

除了想要返回查询返回的项目之外,我还想返回列表的计数。在此查询之后,将在 IQueryable 上实现更多过滤器,但我需要事先进行计数。

我不能更改查询以使其包含计数而不导致多个查询吗?我想要所有这些项目的计数,但我只想要几个项目的数据(之后用

resources.Skip(pageSize).Take(pageSize*pageNumber)

所以我想生成一个查询,它只发送减少的对象列表,但发送更多对象的计数。我知道你可以从像

这样的集合中创建匿名类型

.Select(s => new { property = s.item }

是否可以做我想做的事,还是必须通过存储过程/表值函数来处理?

【问题讨论】:

  • Cant I change the query so it includes the count without it leading to multiple queries? 不是真的,不。另见stackoverflow.com/questions/29218164/…
  • 使用 .Include 和 .Where 不起作用。

标签: c# linq lambda


【解决方案1】:

您要么需要两个查询,要么只需要查询更大的数据集,然后使用代码对其进行过滤。哪种方式效果最好取决于较大数据集的大小。

一个查询:

 var resources = Db.RESOURCE_Resource
     .Include(i => i.RESOURCE_Value.Where(s => s.ApplicatieID == applicationId))
     .Include(i => i.RESOURCE_Category)
     .Where(w => missingCultureIds.All(a => w.RESOURCE_Value.All(an => an.CultureID != a))).ToList();

var count = resources.Count();
var results = resources.Skip(pageSize).Take(pageSize*pageNumber);

两个查询:

var count = Db.RESOURCE_Resource
    .Include(i => i.RESOURCE_Value.Where(s => s.ApplicatieID == applicationId))
    .Include(i => i.RESOURCE_Category)
    .Where(w => missingCultureIds.All(a => w.RESOURCE_Value.All(an => an.CultureID != a))).Count();
var results = Db.RESOURCE_Resource
    .Include(i => i.RESOURCE_Value.Where(s => s.ApplicatieID == applicationId))
    .Include(i => i.RESOURCE_Category)
    .Where(w => missingCultureIds.All(a => w.RESOURCE_Value.All(an => an.CultureID != a))).Skip(pageSize).Take(pageSize*pageNumber);

【讨论】:

  • 您的两个解决方案是相同的。两者都执行两个查询,OP 明确表示他们正在询问如何不这样做。
  • 是的,刚刚发现。用户错误:)
  • 编辑后,这两个解决方案在文本上不再相同,但在语义上仍然相同。
  • 你是对的。我的意思是在计数之前执行第一个解决方案。我添加了一个 ToList() 来执行此操作。
  • 你不需要在计数之前投影 ToList。您可以(更有效地)计算 IQueryable。它发出一个 Sql COUNT 查询。
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
相关资源
最近更新 更多