强制执行IQueryable?

Kir*_*ein 15 linq iqueryable delayed-execution

我有一个'无法转换为SQL'的方法,我想在IQueryable上执行,有没有办法强制IQueryable执行而不必将其存储在某个中间类中?

Jon*_*eet 28

问题是您希望您的方法在本地执行而不是在数据库中执行?如果是的话,AsEnumerable是你的朋友.这是一个非常简单的方法,例如:

public IEnumerable<T> AsEnumerable(IEnumerable<T> source)
{
    return source;
}
Run Code Online (Sandbox Code Playgroud)

重要的是它使结果的编译时类型IEnumerable<T>而不是IQueryable<T>,这意味着您之后调用的任何LINQ查询运算符将是LINQ to Objects而不是LINQ to SQL.

例如:

var query = context.Employees
                   // Filtering performed in SQL
                   .Where(emp => emp.IsFullTime)
                   .AsEnumerable()
                   // Projection performed locally; ComputeSalary has no
                   // SQL equivalent
                   .Select(emp => new { Employee = emp,
                                        Salary = ComputeSalary(emp) });
Run Code Online (Sandbox Code Playgroud)

您可以ToList按照其他地方的建议进行调用,但如果您正在进行过滤并且不需要内存中的完整列表,则调用AsEnumerable和过滤结果将比首先加载所有内容更有效.

  • Linq到EF也有这种技术吗?它似乎不是. (2认同)
  • @Tymek:是的,执行两个SQL查询.但是,通过"本地执行",我的意思是"从数据库中获取查询中的所有结果,然后在内存中执行查询的其余部分" - 这样您就可以执行不适用于SQL的过滤,预测等. (2认同)

Tho*_*ock 7

List<Employees> myEmployees =  myqueryable.ToList();
Run Code Online (Sandbox Code Playgroud)

然后你可以在那个列表上做你的linq东西.