LINQ查询不能使用扩展方法(如Take()),有什么原因吗?

时间:2013-06-09 03:22:58

标签: c# .net linq

我想从DataTable对象中仅检索前100个项目。我之前使用Take()方法在通用列表上完成了这项工作,但不确定为什么它不适用于此。

以下是我的LINQ查询:

    IEnumerable<DataRow> query = (from task in dtTasks.AsEnumerable()
                                  where  task.Field<DateTime>("EstimatedStartTimeStamp") <= DateTime.Parse(DateTime.Today.Date.AddDays(1).ToString("MM/dd/yyyy"))
                                 orderby task.Field<DateTime>("Status")
                                 select task);

    DataTable boundTable = query.CopyToDataTable<DataRow>();

问题是当我尝试使用Take()方法时,它只是不会出现在intellisense中。它显示了其他方法,如OrderBy / OrderByDescending。


更新 :dtTasks是DataTable个对象。

谢谢你的时间!

3 个答案:

答案 0 :(得分:4)

确保您在WebUI和域的参考中有下面的程序集(取决于您的系统设置方式)。

Assembly:  System.Core (in System.Core.dll)

然后在控制器中使用此命名空间,调用Take方法。

Namespace:  System.Linq

答案 1 :(得分:2)

请确保您已添加对程序集System.Data.DataSetExtensions的引用,并使用以下指令:

using System.Linq;
using System.Data.Linq;

必须注意List<T>.AsEnumerable是程序集System.Core和命名空间的一部分:

使用System.Linq;

while,DataTable.AsEnumerable是汇编的一部分:System.Data.DataSetExtensions和命名空间:

using System.Data;

,无论如何

.Take<int32>是命名空间的一部分:

using System.Linq;

答案 2 :(得分:1)

var query = (from task in dtTasks.AsEnumerable()
             where  task.Field<DateTime>("EstimatedStartTimeStamp") <= DateTime.Parse(DateTime.Today.Date.AddDays(1).ToString("MM/dd/yyyy"))
             orderby task.Field<DateTime>("Status")
             select task).Take(3);

不能为你编译吗?

您是否引用了System.Data.DataSetExtensions.dll

如果我创建一个新的Windows窗体项目并将using System.Data;添加到该类的顶部,则以下编译就好了:

var dt = new DataTable();

var query = (from t in dt.AsEnumerable()
             select t).Take(1);

也许干净/重建会为你解决?