显示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();
我希望获得在查询中动态创建的字段数量和金额
答案 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”。