如何使用 Linq 进行多列
How to use Linq for multi-column
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();
以上代码仅使用一列进行筛选。
如何修改 dtText.AsEnumerable()
使其像这样过滤:
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,它将遍历每个下拉附加过滤器。
Where
可以链接调用:
var rows = dtTest.AsEnumerable();
if (...)
rows = rows.Where(r => ...);
if (...)
rows = rows.Where(r => ...);
...
var result = rows.CopyToDataTable();
或者,如果您想存储条件供以后使用,您也可以这样做:
var conditions = new List<Func<DataRow, bool>>();
if (...)
conditions.Add(r => ...);
if (...)
conditions.Add(r => ...);
...
var query = dtTest.AsEnumerable();
foreach (var cond in conditions)
query = query.Where(cond);
var result = query.CopyToDataTable();
您可以逐步建立查询。只需有条件地添加新过滤器并将结果分配给原始查询变量:
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 匹配(反之亦然),那么您可以轻松构建一个过滤器列表,然后循环应用它们:
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();
可以针对您的情况进行一些简化,例如先准备:
List<string> a = new List<string>() {"EN", "SU", "DT", "PR"};
List<string> b = new List<string>() {"Name", "Super", "Deran", "PRate"};
那么你可以简单地做:
strSelectedType = ViewState[a[i-1]].ToString();
strSelectedCol = b[i-1];
然后如果你有下拉列表,你也可以这样做
var query = dtTest.AsEnumerable();
for (int i = 0; i < 4; ++i)
if (dropdown #i-1 index > 0) {
query = query.Where(r => r.Field<string>(strSelectedCol) == ViewState[strSelectedType].ToString());
var result = query.CopyToDataTable();
//Do something, your DataTable is here
}
你也可以使用 List<KeyValuePair>
:
List<KeyValuePair<string,string>> lkvp = new List<KeyValuePair<string,string>>(){
new KeyValuePair("EN", "Name"),
new KeyValuePair("SU", "Super"),
new KeyValuePair("DT", "Deran"),
new KeyValuePair("PR", "PRate")
}
并像这样使用它
strSelectedType = ViewState[lkvp[i-1].Key].ToString();
strSelectedCol = lkvp[i-1].Value;
使用谓词生成器。
当您不知道要过滤的确切选项时,它尤其有用。在到达过滤点之前,您可以简单地构建谓词。
它提高了应用程序的性能,因为您不需要多次过滤集合。
阅读下面的 link:
http://www.albahari.com/nutshell/predicatebuilder.aspx
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();
以上代码仅使用一列进行筛选。
如何修改 dtText.AsEnumerable()
使其像这样过滤:
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,它将遍历每个下拉附加过滤器。
Where
可以链接调用:
var rows = dtTest.AsEnumerable();
if (...)
rows = rows.Where(r => ...);
if (...)
rows = rows.Where(r => ...);
...
var result = rows.CopyToDataTable();
或者,如果您想存储条件供以后使用,您也可以这样做:
var conditions = new List<Func<DataRow, bool>>();
if (...)
conditions.Add(r => ...);
if (...)
conditions.Add(r => ...);
...
var query = dtTest.AsEnumerable();
foreach (var cond in conditions)
query = query.Where(cond);
var result = query.CopyToDataTable();
您可以逐步建立查询。只需有条件地添加新过滤器并将结果分配给原始查询变量:
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 匹配(反之亦然),那么您可以轻松构建一个过滤器列表,然后循环应用它们:
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();
可以针对您的情况进行一些简化,例如先准备:
List<string> a = new List<string>() {"EN", "SU", "DT", "PR"};
List<string> b = new List<string>() {"Name", "Super", "Deran", "PRate"};
那么你可以简单地做:
strSelectedType = ViewState[a[i-1]].ToString();
strSelectedCol = b[i-1];
然后如果你有下拉列表,你也可以这样做
var query = dtTest.AsEnumerable();
for (int i = 0; i < 4; ++i)
if (dropdown #i-1 index > 0) {
query = query.Where(r => r.Field<string>(strSelectedCol) == ViewState[strSelectedType].ToString());
var result = query.CopyToDataTable();
//Do something, your DataTable is here
}
你也可以使用 List<KeyValuePair>
:
List<KeyValuePair<string,string>> lkvp = new List<KeyValuePair<string,string>>(){
new KeyValuePair("EN", "Name"),
new KeyValuePair("SU", "Super"),
new KeyValuePair("DT", "Deran"),
new KeyValuePair("PR", "PRate")
}
并像这样使用它
strSelectedType = ViewState[lkvp[i-1].Key].ToString();
strSelectedCol = lkvp[i-1].Value;
使用谓词生成器。
当您不知道要过滤的确切选项时,它尤其有用。在到达过滤点之前,您可以简单地构建谓词。
它提高了应用程序的性能,因为您不需要多次过滤集合。
阅读下面的 link: http://www.albahari.com/nutshell/predicatebuilder.aspx