在很多情况下,我想在服务器端进行一些过滤(有时是投影),然后切换到客户端,以获取LINQ提供程序本身不支持的操作。LINQ to Entities/LINQ to SQL:在查询理解中从服务器(可查询)切换到客户端(可枚举)?
简易方法(这基本上是我现在做的)是只把它分解成多个查询,类似于:
var fromServer = from t in context.Table
where t.Col1 = 123
where t.Col2 = "blah"
select t;
var clientSide = from t in fromServer.AsEnumerable()
where t.Col3.Split('/').Last() == "whatever"
select t.Col4;
然而,有很多次,这是更多的代码/麻烦比这是非常值得的。我真的很想在中间做一个'切换到客户端'。我已经尝试了使用查询延续的各种方法,但是在第一个查询的末尾执行'select t into foo'之后,foo仍然是单个项目,而不是集合,所以我不能AsEnumerable()它。
我的目标是能写更多的东西一样:
var results = from t in context.Table
where t.Col1 = 123
where t.Col2 = "blah"
// Magic happens here to switch to the client side
where t.Col3.Split('/').Last() == "whatever"
select t.Col4;
使用`ToList`当然有效,但会带来不必要的低效率。第二个“ToList”可能是多余的。 – Timwi 2011-01-28 03:05:01
事实上,对于方法链接版本,我可以调用.AsEnumerable()来执行切换(这是我在问题的第一个版本中所做的)。 ToList也将有类似的效果,但效率较低,因为它会要求创建/填充列表,只有把它用。凡扔掉权之后(这就是为什么我会用AsEnumerable代替) – 2011-01-28 03:10:42
同意,可以更换为ToList更高的效率 – 2011-01-28 03:12:15