0

为了在 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();

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

在此处输入图像描述

4

1 回答 1

1

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


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

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

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

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

或者只是将返回类型更改为IEnumerable<dynamic>,如下所示:

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();

编辑:

从您的评论中,我想我知道发生了什么。您在一个程序集中拥有该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”更改为表单项目的程序集名称。

于 2012-10-18T10:34:46.297 回答