17

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

4

3 回答 3

32

问题是您希望您的方法在本地执行而不是在数据库中执行吗?如果是这样,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列表,那么调用和过滤结果将比首先加载所有内容更有效。

于 2009-04-27T09:39:35.073 回答
7
List<Employees> myEmployees =  myqueryable.ToList();

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

于 2009-04-27T09:31:29.743 回答
2

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

我不确定我是否完全得到您的要求,但据我所知,您有以下选择:

  1. 重写您的查询,以便 LinqToSql 可以翻译它
  2. 在 Sql Server 上执行尽可能多的查询,然后在内存中执行其余的(使用 linq to objects)
  3. 坐下来哭

假设我们排除 #3,让我们看看其他 2 个示例。

  1. 重写它——为了解决这个问题,我们需要你的 linq 查询。

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

并且您可以执行查询而无需存储它吗?好吧,并非如此,您总是可以遍历结果,因此不要将其存储在变量中,但显然查询的结果需要存储在某个地方。

于 2009-04-27T09:33:40.737 回答