【问题标题】:how to get sum of anonymous field in dynamic linq query如何在动态 linq 查询中获取匿名字段的总和
【发布时间】:2012-10-08 18:40:43
【问题描述】:

要在 gridview 的页脚行中显示字段的总和,我想从我的动态列表中获取总和,InTopSuppliersView() 位于单独的程序集 DAL 中,而 gridview 位于表示层内。

DAL 中的代码:

public static dynamic InTopSuppliersView()
{

    var _pd = from pd in InTopSuppliers()
                join pm in PdnmasterDALC.InTopSuppliers() on pd.Pdnmasterid equals pm.Pdnmasterid
                select new
                {
                    RefNo = pm.PDNRefNo,
                    Date = pm.Date
                    Quantity = pd.QuantityApprovedUOM,
                    Rate = pd.Rate,
                    Amount = pd.Amount
                };

    return _pd;
}

表格上的代码:

var tmp = InTopSuppliersView();
gvPDNDetail.DataSource = tmp;
gvPDNDetail.DataBind();

gvPDNDetail.FooterRow.Cells[3].Text = tmp.SUM(o => o.Quantity).ToString();

我想获取在查询中动态创建的字段数量和金额的总和

【问题讨论】:

  • 你的代码有什么问题?
  • 什么是e.Row.Cells[3].Text,因为InTopSuppliersView 中没有变量e
  • 抱歉我更新了代码

标签: asp.net linq dynamic


【解决方案1】:

让我们看看我是否理解正确:


你从InTopSuppliersView 返回一个dynamic 是因为你想返回一个匿名类型的列表,对吧?然后你想在该列表上调用.Sum,但它不适用于语法,因为动态不知道什么是 lambda 表达式 (o => o.Quantity):

如果不先将 lambda 表达式转换为委托或表达式树类型,则不能将其用作动态分派操作的参数

所以我猜你想做这样的事情:

gvPDNDetail.FooterRow.Cells[3].Text = ((IEnumerable<dynamic>)tmp).Sum(o => o.Quantity).ToString();

或者只是将返回类型更改为IEnumerable&lt;dynamic&gt;,如下所示:

public static IEnumerable<dynamic> InTopSuppliersView()
{
    return from pd in InTopSuppliers()
           join pm in PdnmasterDALC.InTopSuppliers() on pd.Pdnmasterid equals pm.Pdnmasterid
           select new
           {
               RefNo = pm.PDNRefNo,
               Date = pm.Date
               Quantity = pd.QuantityApprovedUOM,
               Rate = pd.Rate,
               Amount = pd.Amount
           };
}

然后像以前一样调用它:

// Observe the casing on Sum
gvPDNDetail.FooterRow.Cells[3].Text = tmp.Sum(o => o.Quantity).ToString();

编辑:

从你的 cmets 我想我知道发生了什么。您在一个程序集中有 InTopSuppliersView 方法,在另一个程序集中使用它的表单。我相信创建的匿名类型默认为internal,因此不能在另一个程序集中使用。我认为如果您改用ExpandoObject,它会起作用:

public static IEnumerable<dynamic> InTopSuppliersView()
{
    var _pd = from pd in InTopSuppliers()
              join pm in PdnmasterDALC.InTopSuppliers() on pd.Pdnmasterid equals pm.Pdnmasterid
              select new { pd, pm };

    return _pd.Select(o =>
    {
        dynamic obj = new ExpandoObject();

        obj.RefNo = o.pm.PDNRefNo;
        obj.Date = o.pm.Date;
        obj.Quantity = o.pd.QuantityApprovedUOM;
        obj.Rate = o.pd.Rate;
        obj.Amount = o.pd.Amount;

        return obj;
    });
}

您也可以(而不是上面)在此方法所在的项目中使用 [assembly: InternalsVisibleTo("YourAssemblyName")],并将 "YourAssemblyName" 更改为表单项目的程序集名称。

【讨论】:

  • 我更改了方法的返回类型,如下所示:public static IEnumerable InTopSuppliersView() 我收到错误消息('object' does not contain a definition for 'Quantity')
  • @IrfanUllah 我已经更新了答案;删除 var _pd 并直接返回 linq 或通过将返回值从 return _pd; 更改为 return (IEnumerable&lt;dynamic&gt;)_pd; 来强制返回。
  • 当我按下 => o 时,我得到了同样的错误信息。 (点)它不显示字段(属性)
  • @IrfanUllah o 在您的代码中属于 dynamic 类型。 dynamic 上的属性和方法不会在 Intellisense 中显示,它们将在运行时进行评估。确保查询和 lambda 中的属性具有完全相同的拼写和大小写。您是在编译时还是在运行时遇到错误?
  • @IrfanUllah 所以,试试这个((float)tmp.Sum(o =&gt; (float)o.Quantity)).ToString();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多