为什么Linq不能将表达式/视为本地表达式并抛出exception?

我在这里问了一个关于Linq-to-SQL与C#代码混合导致的Linq错误的问题。 简而言之,编译器会感到困惑,并且没有意识到您打算在从数据库返回调用结果集上的本地函数。

我接受的答案是在结果集上使用AsEnumerable() ,因此在进行任何进一步的计算之前强制它返回所有列。

我现在的问题是,以一种非常类似的方式,我现在尝试通过外键调用与我的结果集相关的对象的方法,例如:

 var q = from c in MyCities.AsEnumerable() // note the AsEnumerable, forcing the query to execute before accessing properties of c let cy = c.County select new { CityName = c.Name, CountyName = cy.Name, CountyFoo = cy.Foo() }; 

猜猜是什么 – 这再次引发了’exception’。 为什么? 很明显,因为我们需要再次返回数据库才能加载相关的c County 。 只有这一次,我不能调用AsEnumerable() ,因为c只有一个县,而不是一个集合!

Dwat那是因为wabbit!

我如何解决这个问题?

另外一个级别的间接应该修复它,虽然我不知道这是多么可读。 从结果集中删除CountyFoo = cy.Foo()CountyName = cy.Name并将其替换为County = cy给你..

 var q = from c in MyCities.AsEnumerable() let cy = c.County select new { CityName = c.Name, County = cy }; 

然后加

 var p = q.AsEnumerable().Select(x => new { CityName = x.CityName, CountyName = x.County.Name, CountyFoo = x.County.Foo() }); 

然后你可以枚举p 。 不过,这是非常模糊的。 为什么你需要所有这些LINQ查询?