如何使用Linq进行多列 [英] How to use Linq for multi-column

查看:91
本文介绍了如何使用Linq进行多列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

if (i == 1) //if dropdown #1 index > 0
{
    strSelectedType = ViewState["EN"].ToString();
    strSelectedCol = "Name";
}
if (i == 2) //if dropdown #2 index > 0
{
    strSelectedType = ViewState["SU"].ToString();
    strSelectedCol = "Super";
}
if (i == 3) //if dropdown #3 index > 0
{
    strSelectedType = ViewState["DT"].ToString();
    strSelectedCol = "Deran";
}
if (i == 4) //if dropdown #4 index > 0
{
    strSelectedType = ViewState["PR"].ToString();
    strSelectedCol = "PRate";
}
DataTable dtTest = new DataTable();
dtTest = (DataTable)ViewState["gvDataTable"];

DataTable selectedTable = dtTest.AsEnumerable()
              .Where(r => r.Field<string>(strSelectedCol) == strSelectedType)
              .CopyToDataTable();

上面的代码仅使用一列进行过滤.

The above code is only using one column to filter.

如何修改dtText.AsEnumerable(),以便它可以像这样过滤:

How can I modify the dtText.AsEnumerable() so that it will filter like this:

DataTable selectedTable = dtTest.AsEnumerable()
          .Where(if (dropdown #1 > 0) {r => r.Field<string>(strSelectedCol) == strSelectedType }
                if (dropdown #2 > 0) { r => r.Field<string>(strSelectedCol) == strSelectedType }
                if (dropdown #3 > 0) { r => r.Field<string>(strSelectedCol) == strSelectedType }
                if (dropdown #4 > 0) { r => r.Field<string>(strSelectedCol) == strSelectedType })
          .CopyToDataTable();

如果所选索引> 0,它将遍历每个下拉附加过滤器.

It will iterate through each dropdown append filter if the selected index > 0.

推荐答案

您可以逐步建立查询.只需有条件地添加新的过滤器,并将结果分配给原始查询变量:

You can build up query step by step. Just conditionally add new filters and assign result to original query variable:

var query = dtTest.AsEnumerable();

if (dropdown1.SelectedIndex > 0)
    query = query.Where(r => r.Field<string>("Name") == ViewState["EN"].ToString());

if (dropdown2.SelectedIndex > 0)
    query = query.Where(r => r.Field<string>("Super") == ViewState["SU"].ToString());

// etc

DataTable selectedTable = query.CopyToDataTable();


如果您可以更改ViewState键,使其与下拉列表ID匹配(反之亦然),那么您可以轻松构建过滤器列表,然后将它们全部应用到循环中:


If you can change ViewState keys so that they'll match dropdowns ids (or vise versa), then you can easily build a list of filters and then apply them all in a loop:

var columns = new Dictionary<string, string> {
    ["EN"] = "Name",
    ["SU"] = "Super",
    ["DT"] = "Deran",
    ["PR"] = "PRate"
};

var filters = from ddl in Controls.OfType<DropDownList>()
              where ddl.SelectedIndex > 0 && columns.ContainsKey(ddl.ID)
              select new {
                  Column = columns[ddl.ID], 
                  Value = ViewState[ddl.ID].ToString()
              };

var query = dtTest.AsEnumerable();
foreach(var fitler in filters)
   query = query.Where(r => r.Field<string>(fitler.Column) == fitler.Value);

DataTable selectedTable = query.CopyToDataTable();

这篇关于如何使用Linq进行多列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆