簡體   English   中英

LINQ實現多重選擇條件

[英]LINQ implement multiple select where condition

我有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);
        }

在上面的代碼中,我從計算wdt和mdt的數據中得到了一個新的數據表dt。 但是在這里,我必須循環運行LINQ語法。 是否可以避免循環和在單個LINQ循環中完成相同的工作?

數據表1:

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

....

數據表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

預期的新數據表:

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

在這里,來自datatable1的iD和userID1,userID2,userID3是相同的。

用戶名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