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

时间:2009-08-31 16:26:34

标签: c# linq linq-to-sql

我问了一个问题here,关于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() };

猜猜是什么 - 这再次引发了'异常'。为什么?很明显,因为我们需要再次返回数据库才能加载相关的County c。只是这一次,我无法拨打AsEnumerable(),因为c只有一个县,而不是一个集合!

Dwat那是因为wabbit!

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

另一个级别的间接应该修复它,虽然我不知道这是多么可读。从结果集中移除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查询?