使用Linq在c#中选择DataRow

3

如何使用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] Monitoring System

请帮忙解决!!

3个回答

7

var a =是一系列DataRow项,您试图将其视为单个对象。如果您想要一个结果,请使用以下之一

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

关于查询,区别在于您对结果的期望。如果可能出现多个项目但您只对第一个感兴趣,请使用First()。如果只有一个项目应该匹配,如果有更多则是错误,请使用Single()。如果在任何一种情况下都可能没有匹配,请使用相应的*OrDefault()版本。

var row = tableClientTableAdapter1.GetData().
               Cast<DataRow>()
               .Where(cName => cName[0].ToString() == txtClientName.Text)
               .FirstOrDefault(); 

if (row != null)
{
     // extract value
}

为了未来的读者。我认为在 .GetData() 后面缺少了 ".Rows"。例如:MyDataTable.Rows.Cast<DataRow>().FirstOrDefault(); - granadaCoder

2

试试这个:

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;

2

如果您要使用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);

1
".ToList()是一个邪恶的拐杖。人们越早学会避免它,就越好。" - Joel Coehoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接