我有一个我想在 IQueryable 上执行的“没有转换为 SQL”的方法,有没有办法强制 IQueryable 执行而不必将它存储在某个中间类中?
问问题
15429 次
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 的查询(这也是它所说的)时,您会收到该消息。
我不确定我是否完全得到您的要求,但据我所知,您有以下选择:
- 重写您的查询,以便 LinqToSql 可以翻译它
- 在 Sql Server 上执行尽可能多的查询,然后在内存中执行其余的(使用 linq to objects)
- 坐下来哭
假设我们排除 #3,让我们看看其他 2 个示例。
重写它——为了解决这个问题,我们需要你的 linq 查询。
在这里,您从初始查询中取出无法翻译的部分,然后在您的 Iqueryable 调用 ToList 上,然后在该列表上应用查询的其余部分。
并且您可以执行查询而无需存储它吗?好吧,并非如此,您总是可以遍历结果,因此不要将其存储在变量中,但显然查询的结果需要存储在某个地方。
于 2009-04-27T09:33:40.737 回答