【发布时间】:2011-05-23 06:25:34
【问题描述】:
我想对名为 Records 的数据表执行 LINQ 查询并检查记录是否存在。如果存在,我想找出它所在的行。我该怎么做?
添加 system.linq 命名空间后,我想在我的数据表上执行 .where,但该方法似乎不存在。请指教
P.S : 我在 vs 2010 中使用 c#
【问题讨论】:
-
您可以使用FirstOrDefault检查记录是否存在。
我想对名为 Records 的数据表执行 LINQ 查询并检查记录是否存在。如果存在,我想找出它所在的行。我该怎么做?
添加 system.linq 命名空间后,我想在我的数据表上执行 .where,但该方法似乎不存在。请指教
P.S : 我在 vs 2010 中使用 c#
【问题讨论】:
DataTable 不是默认使用 Enumerable。你必须转换为
var result = from p in dataTable.AsEnumerable()
where p.Field("ID") == 2
select p.Field("Name");
if(result.Any())
{
//do your work
}
阅读这篇文章
了解您的使用方法Field<T>
【讨论】:
您不能使用该方法,因为DataRowCollection 没有实现IEnumerable<T>。您需要使用AsEnumerable() 扩展名:
var dataRowQuery= myDataTable.AsEnumerable().Where(row => ...
您可能还需要对 System.Data.DataSetExtensions 的项目引用才能使其正常工作。
祝你好运!
【讨论】:
如果你有这样的表:
DataTable dt = new DataTable();
dt.Columns.Add("rownum", typeof(Int32));
dt.Columns.Add("val", typeof(String));
dt.Rows.Add(1, "a");
dt.Rows.Add(2, "b");
dt.Rows.Add(3, "c");
那么,
Console.WriteLine(
dt.Rows.IndexOf(dt.AsEnumerable().Where(c => c.Field<String>(1) == "d").FirstOrDefault())); // `1:= index of column
将导致-1,因为找不到"d"。但是,
Console.WriteLine(
dt.Rows.IndexOf(dt.AsEnumerable().Where(c => c.Field<String>(1) == "b").FirstOrDefault())); // `1:= index of column
将产生1,表示"b"所在的行。
【讨论】: