我可能有一个误解,但我的印象是,如果在枚举器中使用了某个类型,那么你可以进行进一步过滤/排序的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?
答案 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>
提供组合执行的可能性 - 而不是它的承诺。)