【问题标题】:Selecting DataRow using Linq in c#在 C# 中使用 Linq 选择 DataRow
【发布时间】:2011-12-05 18:31:29
【问题描述】:

如何使用 Linq 将其缩短?

int id = 0;
foreach (DataRow dr in tableClientTableAdapter1.GetData())
{
     if (dr[0].ToString() == txtClientName.Text)
      {
          id = Convert.ToInt16(dr[1]);
          break;
      }
}

我试过用这个

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().Where(cName => cName[0].ToString() == txtClientName.Text);
MessageBox.Show(a[1].ToString());

但是我收到了这个错误:

错误 1 ​​无法使用 [] 将索引应用于“System.Data.EnumerableRowCollection”类型的表达式 C:\Users\vrynxzent@yahoo.com\Desktop[Final][GlobalTek] Monitoring System[GlobalTek] Monitoring System\xfrmProjectAwarding .cs 89 37 [GlobalTek] 监控系统

任何帮助!

【问题讨论】:

    标签: c# linq select filter where


    【解决方案1】:

    如果你要使用 cast 方法,你也应该使用 field 方法。

    var a = tableClientTableAdapter1.GetData().Cast<DataRow>().Where(t => t.Field<string>(0) == txtClientName.Text).ToList();
    

    如果要通过索引访问,则添加 ToList()

    如果您只需要第一个匹配项,您可以将 where 替换为 First/FirstOrDefault,具体取决于您希望如何处理 null

    var a = tableClientTableAdapter1.GetData().Cast<DataRow>().First(t => t.Field<string>(0) == txtClientName.Text);
    

    【讨论】:

    • .ToList() 是一个邪恶的拐杖。人们越早学会如何避免它越好。
    【解决方案2】:

    var a = 是您尝试将其视为单个对象的 DataRow 项的序列。如果您想要一个结果,请使用

    .First()
    .FirstOrDefault()
    .Single()
    .SingleOrDefault()
    

    关于查询,不同之处在于您对结果的期望。如果可以存在多个项目,但您只对其中第一个感兴趣,请使用First()。如果只有一项应该匹配,如果有更多则错误,请使用Single()。如果在任何一种情况下都可能存在 no 匹配项,请使用适当的 *OrDefault() 版本。

    var row = tableClientTableAdapter1.GetData().
                   Cast<DataRow>()
                   .Where(cName => cName[0].ToString() == txtClientName.Text)
                   .FirstOrDefault(); 
    
    if (row != null)
    {
         // extract value
    }
    

    【讨论】:

    • 为未来的读者。我 ~~ 认为 ~~ 缺少“.Rows”(在 .GetData() 之后。示例:MyDataTable.Rows.Cast().FirstOrDefault();
    【解决方案3】:

    试试这个:

    var a = Convert.ToInt16(tableClientTableAdapter1.GetData().Cast<DataRow>().First(r => r[0].ToString() == txtClientName.Text)[1]);
    

    但请注意,如果没有匹配,它将引发异常。如果有可能,您应该这样做:

    var a = tableClientTableAdapter1.GetData().Cast<DataRow>().FirstOrDefault(r => r[0].ToString() == txtClientName.Text);
    var b = (a != null)?Convert.ToInt16(a[1]):0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2011-10-16
      相关资源
      最近更新 更多