Я новичок в LINQ, поэтому я уверен, что в моей логике есть ошибка.Запрос LINQ, не возвращающий строки
У меня есть список объектов:
class Characteristic
{
public string Name { get; set; }
public string Value { get; set; }
public bool IsIncluded { get; set; }
}
Использование каждого объекта в списке, я хочу создать запрос в LINQ, который начинается с DataTable
и фильтров он на основе значений объекта, и в результате получается DataTable
.
Мой код до сих пор:
DataTable table = MyTable;
// Also tried: DataTable table = MyTable.Clone();
foreach (Characteristic c in characteristics)
{
if (c.IsIncluded)
{
var q = (from r in table.AsEnumerable()
where r.Field<string>(c.Name) == c.Value
select r);
table = rows.CopyToDataTable();
}
else
{
var q = (from r in table.AsEnumerable()
where r.Field<string>(c.Name) != c.Value
select r);
table = q.CopyToDataTable();
}
}
UPDATE
Я был в панике и спешке, я сделал ошибку; мой DataTable
не был пуст, я просто забыл связать его с DataGrid
. Но также, Хенк Холтерман указал, что я переписывал свой результирующий набор на каждую итерацию, что было логической ошибкой.
Код Хенка, кажется, работает лучше всего, но мне нужно сделать больше испытаний.
Ответ Спинона также помог мне набраться ясности, но его код дал мне ошибку.
Мне нужно лучше понять код Тимви, но в его текущей форме это не сработало для меня.
НОВЫЙ КОД
DataTable table = new DataTable();
foreach (Characteristic c in characteristics)
{
EnumerableRowCollection<DataRow> rows = null;
if (c.IsIncluded)
{
rows = (from r in MyTable.AsEnumerable()
where r.Field<string>(c.Name) == c.Value
select r);
}
else
{
rows = (from r in MyTable.AsEnumerable()
where r.Field<string>(c.Name) != c.Value
select r);
}
table.Merge(rows.CopyToDataTable());
}
dataGrid.DataContext = table;
Я хочу переписать его, потому что я хочу применить * ВСЕ * фильтры. Даже после первой итерации таблица выглядит пустой. Вот почему я решил создать новую ссылку DataTable для этого блока кода. – JohnB