为什么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查询?