Linq查询到Datasource,InvalidOperationException

时间:2016-01-29 09:38:49

标签: c# linq

我尝试从简单的MS Access数据库查询表,本地文件,查询有效,但我无法将其设置为DataSoruce:

 IEnumerable<DataRow> result = from row in bDSpitalDataSet.Tabel.AsEnumerable()
                     where row.Varsta >= up &&
                           row.Varsta <= down &&
                           row.CNP.StartsWith(Convert.ToString(sex))
                     select row;

        DataTable resultTable = result.CopyToDataTable<DataRow>();

        tabelBindingSource.DataSource = resultTable;

        dataGridView1.Update();

所以我在InvalidOperationException获得DataTable resultTable = result.CopyToDataTable<DataRow>(); 操作。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我假设[1](编辑:现已由OP确认)您未在tabelBindingSource.DataSource = resultTable但在result.CopyToDataTable<DataRow>()获得例外,因为查询没有& #39; t包含任何DataRows。新DataTable的列将从DataRow.Table.Columns派生,如果没有行,则没有信息。

例外是documented

InvalidOperationException

  • 源序列中的DataRow状态为Deleted
  • 源序列不包含任何DataRow个对象
  • 源序列中的DataRownull

您可以使用Any进行检查:

if(result.Any())
{
    DataTable resultTable = result.CopyToDataTable<DataRow>();
    tabelBindingSource.DataSource = resultTable;
    dataGridView1.Update();
}

更有效的方法:

DataTable resultTable = bDSpitalDataSet.Tabel.Clone();
foreach(DataRow row in result.Rows)
    resultTable.LoadDataRow(row.ItemArray, false);

效率更高,因为result.Any()需要执行查询以确定是否至少有一行,result.CopyToDataTable<DataRow>()再次执行该行。

[1]为什么我认为你提到了错误的错误线?由于你的评论:

  

未处理的类型&#39; System.InvalidOperationException&#39;发生在System.Data.DataSetExtensions.dll