帮助使用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。我有没有的想法如何做这样的事情

帮助使用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的行。