强制执行IQueryable?

时间:2009-04-27 09:28:51

标签: linq iqueryable delayed-execution

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

3 个答案:

答案 0 :(得分:27)

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

public IEnumerable<T> AsEnumerable(IEnumerable<T> source)
{
    return source;
}

重要的是它使得结果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) });

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

答案 1 :(得分:7)

List<Employees> myEmployees =  myqueryable.ToList();

然后你可以在那个列表上做你的linq。

答案 2 :(得分:2)

当您编写了LinqToSql不知道如何转换为SQL的查询时,您会得到该消息(这也是它所说的)。

我不确定我得到了你所要求的,但据我所知,你有以下选择:

  1. 重写您的查询,以便LinqToSql CAN翻译它
  2. 尽可能多地在Sql Server上执行查询,然后在内存中执行其余操作(使用linq到对象)
  3. 坐下来哭泣
  4. 假设我们排除#3,让我们看看其他两个例子。

    1. 重写它 - 为了帮助你,我们需要你的linq查询。

    2. 在这里,您将从初始查询中取出无法翻译的部分,然后取出您的Iqueryable调用ToList,然后在该列表中应用其余查询。

    3. 你可以执行查询而不必存储它吗?好吧,不是真的,你总是可以遍历结果,因此不会将它存储在变量中,但显然查询的结果需要存储在某个地方。