C#中如何获取Table1中满足特定条件的ID数据
问题:获取满足条件的Table1 ID
我有两个数据表,需要获取Table1中的ID,满足以下任一条件:
- 该行的User在Table2中存在
- 该行的ID为3(无论User是否存在)
当前测试代码仅能获取到Table2中存在对应User的Table1的ID,无法同时获取ID=3的行。根据示例数据,期望输出如下:
- 第一个示例:
idGet = "1,3" - 第二个示例:
idGet = "2,3"
原测试代码:
string idGet = ""; string getValue = "Select ID, Port, User from Table1"; DataTable dtgetValue = XLDL.ReadTable(getValue); if(dtgetValue.Rows.Count > 0) { List<ListOtherUser> listOtherUser = new List<ListOtherUser>(); for (int i = 0; i < dtgetValue.Rows.Count; i++) { listOtherUser.Add(new ListOtherUser { ID = dtgetValue.Rows[i]["ID"].ToString(), User = dtgetValue.Rows[i]["User"].ToString(), Port = dtgetValue.Rows[i]["Port"].ToString() }); } foreach (var itemuser in listOtherUser) { string checkUser = "Select ID from Table2 where User = N'" + itemuser.User + "'"; DataTable dtcheckUser = XLDL.ReadTable(checkUser); if (dtcheckUser.Rows.Count > 0) { idGet += itemuser.ID + ","; } else { //Here I want to continue to get the data of row ID=3 from Table1. However I don't know how to solve it? } } }
方案1:直接用SQL查询(推荐)
这种方式无需循环查询数据库,一次SQL即可完成,性能更优,避免N+1查询问题。
方式A:使用IN子查询
SELECT ID FROM Table1 WHERE User IN (SELECT User FROM Table2) OR ID = 3
方式B:使用LEFT JOIN
SELECT DISTINCT t1.ID FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.User = t2.User WHERE t2.User IS NOT NULL OR t1.ID = 3
执行这个SQL后,直接读取结果集即可得到符合条件的ID,无需后续循环处理。
方案2:修改现有C#代码
如果需要保留原有代码逻辑,可通过添加ID判断并引入去重机制来实现需求:
string idGet = ""; // 用HashSet自动去重,避免ID=3被重复添加(比如其User同时在Table2中) HashSet<string> uniqueIds = new HashSet<string>(); string getValue = "Select ID, Port, User from Table1"; DataTable dtgetValue = XLDL.ReadTable(getValue); if(dtgetValue.Rows.Count > 0) { List<ListOtherUser> listOtherUser = new List<ListOtherUser>(); for (int i = 0; i < dtgetValue.Rows.Count; i++) { listOtherUser.Add(new ListOtherUser { ID = dtgetValue.Rows[i]["ID"].ToString(), User = dtgetValue.Rows[i]["User"].ToString(), Port = dtgetValue.Rows[i]["Port"].ToString() }); } foreach (var itemuser in listOtherUser) { string checkUser = "Select ID from Table2 where User = N'" + itemuser.User + "'"; DataTable dtcheckUser = XLDL.ReadTable(checkUser); // 满足任一条件即加入结果:User在Table2存在,或ID为3 if (dtcheckUser.Rows.Count > 0 || itemuser.ID == "3") { uniqueIds.Add(itemuser.ID); } } // 将去重后的ID拼接为逗号分隔的字符串 idGet = string.Join(",", uniqueIds); }
说明:
- 使用
HashSet<string>存储ID,自动避免重复值(比如当ID=3的User同时存在于Table2时,不会被添加两次) - 直接在判断条件中加入
itemuser.ID == "3",覆盖第二种需求场景 - 最后用
string.Join将HashSet转为所需的字符串格式
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

