저는 LINQ를 처음 사용 했으므로 아래 논리에 오류가 있다는 것을 확신합니다.행을 반환하지 않는 LINQ 쿼리
나는 개체의 목록을 가지고, 내가 개체 값에 따라 A A DataTable
시작 LINQ 쿼리 및 필터를 구축하려는 목록의 각 객체를 사용
class Characteristic
{
public string Name { get; set; }
public string Value { get; set; }
public bool IsIncluded { get; set; }
}
을하고, 그 결과로 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
에 바인딩하는 것을 잊었습니다. 또한, Henk Holterman은 논리 오류 인 각 결과를 덮어 쓰고 있다고 지적했습니다.
헨크 코드가 지금까지 가장 잘 작동하는 것 같지만 테스트를 더해야합니다.
Spinon의 답변도 내 마음을 명확하게하는 데 도움이되었지만 코드가 오류를 발생 시켰습니다.
나는 Timwi의 코드를 더 잘 이해하려고 노력할 필요가 있지만 현재의 형태로는 나에게 적합하지 않다. 그것은 단지 마지막 라운드의 결과를 보유하고 있으며 분명히 빈입니다 그 그래서 결국
NEW CODE는
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