【发布时间】:2017-02-17 16:02:05
【问题描述】:
我想检索一个元素列表作为 group by 的复合键的一部分。但到目前为止,我一直无法编写查询来执行此操作。
我们正在显示每种 RawMaterial 的总库存(以下是模型的更多详细信息),我们希望与每种 RawMaterial 的供应商一起列出。 我试过这个查询:
var list = this.Stocks.Where(x => x.StockType == StockTypeEnum.RawMaterialEntered)
.GroupBy(i => new { RawMaterialId = i.RawMaterial.Id, RawMaterial = i.RawMaterial.Name,
Suppliers = i.RawMaterial.Suppliers.Select(j=> new { Id= j.Supplier.Id, Name = j.Supplier.Name}) })
.Select(g => new StockSummary
{
TotalAmount = g.Sum(i => i.Amount),
ComponentId = g.Key.RawMaterialId,
Component = g.Key.RawMaterial,
Suppliers = g.Key.Suppliers.Select(h=> new StockItemModel(){ Id = h.Id, Name = h.Name} ).ToList()
})
.OrderByDescending(g => g.Component).ToList();
它可以构建,但是当我尝试运行它时,我得到了这个异常:
“System.NotImplementedException”类型的第一次机会异常 发生在 NHibernate.dll 中
我们尝试了不同的方法,但都没有奏效。是否可以通过一次查询获得所需的结果?
我有这个模型:
public class Stock
{
public RawMaterial RawMaterial{ get; set; }
public int Amount { get; set; }
}
public class RawMaterial
{
public int Id{ get;set; }
public string Name { get;set; }
public IList<SupplierInfo> SupplierInfos{ get;set; }
}
public class SupplierInfo
{
public int Id{ get;set; }
public Supplier Supplier { get;set; }
}
public class Supplier
{
public int Id { get;set; }
public string Name { get; set; }
}
最初我们有一个网格,我们在其中显示每种原材料的可用总库存。我们使用此查询检索该信息:
var list = this.Stocks.Where(x => x.StockType == StockTypeEnum.RawMaterialEntered)
.GroupBy(i => new { RawMaterialId = i.RawMaterial.Id, RawMaterial = i.RawMaterial.Name })
.Select(g => new StockSummary
{
TotalAmount = g.Sum(i => i.Amount),
ComponentId = g.Key.RawMaterialId,
Component = g.Key.RawMaterial,
})
.OrderByDescending(g => g.Component).ToList();
此数据显示在与此类似的表格中:
现在,如上所述,我们想显示提供上述组件的供应商列表。是否可以在一个查询中完成所有操作?
【问题讨论】:
-
您在寻找hibernate解决方案还是sql server解决方案?我无法开始帮助您进行休眠,但在 sql server 中,您可以轻松地使用东西和 xml。看看这里。 stackoverflow.com/questions/451415/…
-
您是否在
GroupBy调用中按列表对数据进行分组?据我所知,NHibernate 和 EF 都不支持这种操作。 -
我会说不,你不能在一个查询中做到这一点。在第一次查询中获取您需要的所有结果,从数据库中加载它们并将它们分组到您的应用程序中。我不确定你想要做什么甚至在 SQL 中是可能的。
-
@Sidewinder94 应用程序中的分组将依赖于手动选择组成员,因为它会要求进行集合比较。我从来没有在这个问题上看到过这样的尝试。
-
@ZoranHorvat 不,它不存在于问题中,但如果 OP 真的需要他的列表分组,这可能是一个解决方案。
标签: c# sql-server linq nhibernate