如何在动态linq查询中获取匿名字段的总和

时间:2012-10-18 10:20:21

标签: asp.net linq dynamic

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

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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


您从dynamic返回InTopSuppliersView,因为您想要返回一个匿名类型的列表,对吗?然后你想在该列表上调用.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”