Выбор DataRow с помощью Linq в c # - PullRequest
2 голосов
/ 12 октября 2011

Как я могу сделать это более коротким, используя 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 [Финальный] [GlobalTek] Система мониторинга [GlobalTek] Система мониторинга \ xfrmProjectAwarding.cs89 37 [GlobalTek] Система мониторинга

Любая помощь !!

Ответы [ 3 ]

5 голосов
/ 12 октября 2011

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
}
2 голосов
/ 12 октября 2011

Если вы собираетесь использовать метод приведения, вы должны также использовать метод поля.

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

ToList () добавлен, если вы хотите получить доступ через индекс

Если вам нужно толькопервое совпадение, которое вы можете заменить где First / FirstOrDefault в зависимости от того, как вы хотите обработать null

var a = tableClientTableAdapter1.GetData().Cast<DataRow>().First(t => t.Field<string>(0) == txtClientName.Text);
2 голосов
/ 12 октября 2011

Попробуйте это:

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;
...