简体   繁体   English

LINQ实现多重选择条件

[英]LINQ implement multiple select where condition

I have 2 datatables. 我有2个数据表。

        DataTable wdt = new DataTable();
        wdt.Columns.Add("wName", typeof(string));
        wdt.Columns.Add("userID1", typeof(string));
        wdt.Columns.Add("userID2", typeof(string));
        wdt.Columns.Add("userID3", typeof(string));
        wdt.Columns.Add("dttime", typeof(DateTime));

        DataTable mdt = new DataTable();
        mdt.Columns.Add("iD", typeof(string));
        mdt.Columns.Add("firstname", typeof(string));
        mdt.Columns.Add("lastname", typeof(string));

        DataTable dt = new DataTable();
        dt.Columns.Add("wName", typeof(string));
        dt.Columns.Add("user1", typeof(string));
        dt.Columns.Add("user2", typeof(string));
        dt.Columns.Add("user3", typeof(string));
        dt.Columns.Add("dttime", typeof(DateTime));

        for (int i = 0; i < wdt.Rows.Count; i++)
        {
            DataRow ndr = dt.NewRow();
            ndr[0] = wdt.Select()[i][0].ToString();

            ndr[1] = (from r in mdt.AsEnumerable()
                              where r.Field<int>("iD") == Convert.ToInt32(wdt.Rows[i][1])
                              select r.Field<string>("firstName") + " " + r.Field<string>("lastName")).First<string>();
                ndr[2] = (from r in mdt.AsEnumerable()
                          where r.Field<int>("iD") == Convert.ToInt32(wdt.Rows[i][2])
                          select r.Field<string>("firstName") + " " + r.Field<string>("lastName")).First<string>();
                ndr[3] = (from r in mdt.AsEnumerable()
                          where r.Field<int>("iD") == Convert.ToInt32(wdt.Rows[i][3])
                          select r.Field<string>("firstName") + " " + r.Field<string>("lastName")).First<string>();


           ndr[4] = wdt.Select()[i][4].ToString();

           dt.Rows.Add(ndr);
        }

In the above code, i get a new datatable dt from calculating the data from wdt & mdt. 在上面的代码中,我从计算wdt和mdt的数据中得到了一个新的数据表dt。 But here, i have to run the LINQ syntaxes in a loop. 但是在这里,我必须循环运行LINQ语法。 Is it possible to avoid loop & the same work to be done in a single LINQ loop? 是否可以避免循环和在单个LINQ循环中完成相同的工作?

Datatable1 : 数据表1:

iD  firstname  lastname
1      b           v
2      d           c
3      f           g
4      s           o

....

Datatable2 : 数据表2:

Code        userid1    userid2      userid3  work
    1f           1           3           6       gg
    2g           1           4           7       gg
    3b           3           4           7       gg
    4v           4           3           8       gg

Expected New Datatable : 预期的新数据表:

Code    username1   username2   username3  work
1f           a           b           c       gg
2g           d           f           r       gg
3b           c           h           g       gg
4v           d           s           h       gg

Here, iD from datatable1 & userID1, userID2, userID3 are same. 在这里,来自datatable1的iD和userID1,userID2,userID3是相同的。

username1 you can Make a query using left join and return new on the fly object witch have all property you need as below 用户名1,您可以使用左联接进行查询,并立即返回新对象,它具有您需要的所有属性,如下所示

    var newData = (from a in wdt.AsEnumerable()
        join user1Info in mdt.AsEnumerable() on a["userID1"] equals user1Info["iD"] into lUser1Info
        join user2Info in mdt.AsEnumerable() on a["userID2"] equals user2Info["iD"] into lUser2Info
        join user3Info in mdt.AsEnumerable() on a["userID3"] equals user3Info["iD"] into lUser3Info
        from user1Info in lUser1Info.DefaultIfEmpty()
        from user2Info in lUser2Info.DefaultIfEmpty()
        from user3Info in lUser3Info.DefaultIfEmpty()
        select new
        {
            wName = a["wName"].ToString(),
            username1 = user1Info == null ? string.Empty : user1Info["firstname"].ToString() + user1Info["lastname"],
            username2 = user2Info == null ? string.Empty : user2Info["firstname"].ToString() + user2Info["lastname"],
            username3 = user3Info == null ? string.Empty : user3Info["firstname"].ToString() + user3Info["lastname"],
            dttime = a["dttime"]
        }).ToList();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM