c#实体框架组通过加入

时间:2017-02-17 16:28:58

标签: c# entity-framework

我有一个自定义类型,我填充两个表中的数据。我尝试了以下两个表,这通常有效。但是group by和count导致了错误:

public List<sLoadingList> GetOrdersforLoadingByWard(string _mywCode, DateTime _orderDate, int _periodId)
{
    var _formattedDate = _orderDate.Date;
    List<sLoadingList> query = (from o in CateringEntities.Orders
                                join i in CateringEntities.OrderItems
                                on o.OrderId equals i.OrderId
                                where o.LocationsLookUp.WardCode.Equals(_mywCode) &&
                                DbFunctions.TruncateTime(o.Date) == _formattedDate && o.Period == _periodId
                                select new sLoadingList()
                               {
                                   ItemId = i.ItemId,
                                   ItemName = i.Item.ItemName,
                                   ItemType = i.ItemType,
                                   Quantity = i.Item.ItemName.Count()
                               }).GroupBy(i => i.ItemId).Select(i => i.FirstOrDefault()).ToList();
    return query.ToList();

目前这是错误的:

{"DbExpressionBinding requires an input expression with a collection 
                                                ResultType.\r\nParameter name: input"}

但如果我删除:

Quantity = i.Item.ItemName.Count()

查询运行正常。

1 个答案:

答案 0 :(得分:2)

基本上,您尝试在尚未分组的一组数据上使用聚合(Count())。

首先尝试按ItemId,ItemName和ItemType进行分组,然后选择包含Count()的部分。

正如我评论的那样,在没有看到所有表格的情况下,很难给出确切的答案,但尝试这样的事情 -

List<sLoadingList> query = 
(
    (
        from o in first
        join i in second 
        on o.OrderId equals i.OrderId
        where ... some condition ...
        select new sLoadingList()
        {
            ItemId = i.ItemId
            , ItemName = i.Item.ItemName
            , ItemType = i.ItemType
        }
    )
    .GroupBy(i => i.ItemId)
    .ThenBy(i => i.ItemName)
    .ThenBy(i => i.ItemType)
    .Select(i => new {KeyData = i.Key, Cnt = i.Item.ItemName.Count()})
)
.GroupBy(i => i.KeyData.ItemId)
.Select(i => i.FirstOrDefault())
.ToList();

基本上,您创建一个查询来提取您要汇总的数据,然后对其进行分组,然后您可以应用聚合,例如count。

一些提示 -

  • 请记住,您不必在一个查询中执行此操作,尝试拆分更易于理解的较小查询
  • 尝试LinqPad,因为这对测试这样的东西很有用 (www.linqpad.net)