在使用List<T>获取数据库表的时候,每次用户操作都重新访问数据库,然后返回List<T>,会严重影响程序运行效率的方式,其实List<T>自带有筛选的方法,把想要的数据筛选到另一个List<T>中,不用重新访问数据库,直接筛选后绑定控件显示即可。
示例如下:
public NumberModel currentmark;
public MainFrm mainFrm;
private List<GoodsModel> goodslist;
private List<GoodsKindModel> goodskindlist;
private void lstgoodkind_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (lstgoodkind.SelectedValue.ToString() != "XY.Model.GoodsKindModel")
{
string id = lstgoodkind.SelectedValue.ToString();
string kname = lstgoodkind.Text;
if (kname != "全部")
{
List<GoodsModel> glist = goodslist.FindAll(delegate(GoodsModel p) { return p.GoodsKind == kname; });
bindgoods(dgvgoods, glist);
}
else
{
bindgoods(dgvgoods, goodslist);
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
try
{
string gid = dgvgoods.Rows[dgvgoods.SelectedRows[0].Index].Cells["goodsid"].Value.ToString();
GoodsModel goods = goodslist.Find(delegate(GoodsModel p) { return p.ID == gid; });
XY.BLL.ConsumeBll.Add(goods, currentmark, mainFrm.user);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
更好的方法是利用lambda:
list.GroupBy(t => t.customerid)
.Select(g => (new ViewSaleDetail()
{
customerid = g.Key,
companyname = g.First().companyname,
unitname = g.First().unitname,
code = g.First().code,
customername = g.First().customername,
num = g.Sum(m => m.num),
paidinamount = g.Sum(m => m.paidinamount),
costprice = g.Sum(m => m.costprice),
actdisc = g.Average(m => m.actdisc * m.userdisc),
retailprice = g.Average(m => m.paidinamount)
})).ToList();