C#中如何查找DataTable中匹配文本框输入Email值的行?
问题:DataTable根据邮箱匹配行数据并返回UI
我有一个名为dt的DataTable,包含firstname、lastname、companymname和emailId列,共N行数据。用户在文本框输入邮箱地址,我在C#类函数中获取该值并赋值给emailaddress变量,需要将emailaddress与emailId列的值逐一比对,匹配的话就把整行数据通过ViewBag返回给UI。
现有代码:
var dt = ExcelDataToDataTable(fileName, "Sheet1"); var emailaddress = emailaddress ; DataRow[] result = dt.Select("Email = emailaddress");
现有代码问题说明
- 列名错误:DataTable中的目标列是
emailId,代码里写成了Email,名称不匹配会导致找不到列。 - 变量引用错误:
Select方法的字符串参数里直接写emailaddress会被当成字面量,不会读取变量的值,匹配逻辑完全失效。 - 变量赋值错误:
var emailaddress = emailaddress;是无效的自赋值,需要替换成实际获取用户输入的代码。
修正后的代码方案
方案1:修正DataTable.Select语句
var dt = ExcelDataToDataTable(fileName, "Sheet1"); // 替换成实际获取用户输入邮箱的代码,比如从请求参数中获取 var emailaddress = Request.Form["emailInput"]; // 修正列名,同时转义单引号避免语法错误 DataRow[] result = dt.Select($"emailId = '{emailaddress.Replace("'", "''")}'"); // 将匹配的第一行存入ViewBag(有多行匹配可根据需求调整) ViewBag.MatchedRow = result.FirstOrDefault();
方案2:使用LINQ查询(更推荐)
LINQ方式类型安全,无需处理字符串转义,可读性更高:
var dt = ExcelDataToDataTable(fileName, "Sheet1"); var emailaddress = Request.Form["emailInput"]; // 用LINQ筛选匹配的行 var matchedRow = dt.AsEnumerable() .FirstOrDefault(row => row.Field<string>("emailId") == emailaddress); // 将结果存入ViewBag ViewBag.MatchedRow = matchedRow;
内容的提问来源于stack exchange,提问作者Naveen Ponnusamy
相关产品推荐
相关产品推荐

