在SQL执行之前返回IQueryable DataTable?

时间:2011-02-11 11:51:14

标签: c# .net linq generics

我可能有一个误解,但我的印象是,如果在枚举器中使用了某个类型,那么你可以进行进一步过滤/排序的IQueryable对象只执行相关的SQL,例如/

IQueryable<Person> people = Person.All();
var peeps = people.Where(x = > x.Name = "John" && x.Surname == "Smith");
//At this point it generates a SQL and hits the DB?????
foreach (var person in peeps)  
{
...
}

因此可以以某种方式使用DataTable执行此操作吗?不是执行SQL语句并将其放入DataTable然后过滤掉,而是进行过滤,然后在枚举后执行SQL。这显然会阻止所有返回的数据开始。

//Normal DataAdapter/DataTable fill approach
SqlDataAdapter da = new SqlDataAdapter(sql, cn);
da.Fill(dtConfig);
var result dtConfig.Rows.Cast<DataRow>()
      .Where(x => x.ItemArray.Any(
             y => y.ToString().IndexOf(param.sSearch, StringComparison.OrdinalIgnoreCase) >= 0));  //Search all columns
foreach(var row in result)
   {
     ....
   }

我不认为这是可能的,希望你可以证明不然,但认为如果可以的话可能会非常整洁。我想问题是SQL需要知道哪些列应该被过滤等等但是我想你可以通过FillSchema填充DataTable然后进行过滤/排序然后在枚举上执行SQL?

2 个答案:

答案 0 :(得分:0)

这是不可能的,因为DataTable.Fill直接从数据库中提取数据。请参阅备注下的msdn

答案 1 :(得分:0)

没有;使用DataTable加载数据的Fill操作。之后,您正在执行的任何LINQ都是针对已经在内存中的数据的LINQ到对象。我希望你实际上是在反对IEnumerable<T>,而不是IQueryable<T>

即使你调用.AsQueryable(),这仍然只是将LINQ-to-Objects暴露为IQueryable<T>(对于代码重用很有用)的冒烟技巧 - 它仍然是LINQ -to-Objects,仍然只对内存数据进行操作(IQueryable<T>提供组合执行的可能性 - 而不是它的承诺。)