帮助使用LINQ查询数据表
本文关键字:查询 数据表 LINQ 帮助 | 更新日期: 2023-09-27 18:06:28
假设我有这样的初始代码:
DataTable table = new DataTable();
table.Columns.Add("column1", typeof(int));
table.Columns.Add("column2", typeof(int));
table.Columns.Add("column3", typeof(string));
table.Rows.Add(1, 0, "a");
table.Rows.Add(2, 1, "b");
table.Rows.Add(3, 1, "c");
table.Rows.Add(4, 3, "d");
table.Rows.Add(5, 3, "e");
如何使用LINQ实现这些?
。返回其值在column1中也出现在column2中的datarrow。
到目前为止,我这样做了:
var x = (from t1 in table.AsEnumerable()
select t1.Field<int>(0)).Intersect
((from t2 in table.AsEnumerable()
select t2.Field<int>(1)).Distinct());
但问题是,只返回列n1的值,我使用foreach
。可能是因为select t1.Field<int>(0)
部分,但我不知道如何返回datarow本身。
b。返回column1中的值在column2中也出现的column3的值。
几乎和[a]一样的问题。我只能返回列1行,因为我已经用过它了。我不知道如何返回数据row和其他列(例如column3)除了column1。
我也试过这个:
var x1 = from t in table.AsEnumerable()
select t;
var x2 = (from t in table.AsEnumerable()
select t.Field<int>(1)).Distinct();
我希望在x1和x2上使用Intersect(),但我不知道如何使用。特别是因为x1有点像DataRow[], x2有点像int[]。
c。将[a]中的答案用于另一个查询
或者将一个LINQ中的东西用于另一个LINQ。我有没有的想法如何做这样的事情
方法:
a) var result = (from t1 in table.AsEnumerable()
join t2 in table.AsEnumerable() on t1.Field<int>(0) equals t2.Field<int>(1) select t1).Distinct();
上面的查询返回IEnumerable<DataRow>
.从这个结果中,您可以在b)场景中选择像t2.Field<int>(2)
这样的column3的值。
我将为这三列创建一个新类。然后为新类创建一个Iqueryable或List,并将表行添加到其中。那么Linq表达式应该可以工作了。
类public class myClass
{
public int column1
{
get;
set;
}
public int column2
{
get;
set;
}
public stringcolumn3
{
get;
set;
}
}
Linq
。返回其值在column1中也出现在column2中的datarrow。
var x = (from l1 in myList
where (from l2 in myList
select l2.column2).contains(l1.column1)
select l1);
b。返回column1中的值在column2中也出现的column3的值。
var col3Values = (from l1 in myList
where l1.column2 = l1.column3
select l1.column3);
在这里和其他一些网站的帮助下,我刚刚找到了如何实际做到上面的[b]。
如果column1 中的值没有出现在column2:
中,则返回column3中的值。 from t in table.AsEnumerable()
join t2 in table.AsEnumerable().Select(i => i.Field<int>(0)).Except(table.AsEnumerable().Select(j => j.Field<int>(1)))
//the inner Select() returns column1 whose values in it also appears in column2
//I can use either this or the first LINQ I made above
//By the way, I said **does not** because I don't think I can use inner join on the opposite of [b]
//unlike the Select() with lambda above; I can just change the Intersect() to Except() :)
on t.Field<int>(0) equals t2
where t.Field<int>(1) > 2 //If I need some other condition
select t.Field<string>(2);
对于[c],我创建了另一个表:
DataTable tableA = new DataTable();
tableA.Columns.Add("columnA", typeof(string));
tableA.Columns.Add("columnB", typeof(string));
tableA.Rows.Add("apple", "red");
tableA.Rows.Add("banana", "yellow");
tableA.Rows.Add("carrot", "orange");
tableA.Rows.Add("dog", "commonly brown"); //ok, I can't think of a fruit/vegetable that starts with 'd' right now...
tableA.Rows.Add("eggplant", "purple");
并将第一个表重命名为table1,以避免/减少混淆
var x = from tA in tableA.AsEnumerable()
from t1 in (
from t1 in table1.AsEnumerable()
join t2 in ((from t2_1 in table1.AsEnumerable()
select t2_1.Field<int>(0)).Except
((from t2_2 in table1.AsEnumerable()
select t2_2.Field<int>(1))).Distinct())
on t1.Field<int>(0) equals t2
where t1.Field<int>(1) > 2 //extra condition
select t1.Field<string>(2))
where tA.Field<string>(0).StartsWith(t1)
select tA;
返回tableA中列na以返回的table1的column3开头的行,其中column1的值没有出现在column2中,并且在其column2中值大于2的行。