我有一个'无法转换为SQL'的方法,我想在IQueryable上执行,有没有办法强制IQueryable执行而不必将它存储在某个中间类中?
答案 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的查询时,您会得到该消息(这也是它所说的)。
我不确定我得到了你所要求的,但据我所知,你有以下选择:
假设我们排除#3,让我们看看其他两个例子。
重写它 - 为了帮助你,我们需要你的linq查询。
在这里,您将从初始查询中取出无法翻译的部分,然后取出您的Iqueryable调用ToList,然后在该列表中应用其余查询。
你可以执行查询而不必存储它吗?好吧,不是真的,你总是可以遍历结果,因此不会将它存储在变量中,但显然查询的结果需要存储在某个地方。