执行以下 Linq to Sql 语句时,我遇到了“代码应该是不可达的”错误。我正在使用EF 6.1.3版。我认为这是与导航属性过滤有关的已知错误。似乎在EF7中可能已经修复了这个问题,但我在EF 6.2发行说明和GitHub上的EF6未完成事项中没有找到相关内容,所以我想寻找一种解决方法,也许是用一种不同的方式编写我的Linq语句。
最终,我在多个地方应用相同的 where 子句 (AccountSecurity),还基于传递用户密钥参数,所以我认为我可以将其转换为一个函数,生成表达式以在我的Linq to Sql 语句的 where 子句中使用。
public List<Company> GetCompanyList(int p_UserKey, MemberType p_MemberType)
{
var qry = from cs in this.DbContext.CompanySet
.Where(c => c.Accounts.AsQueryable().Any(this.AccountSecurity(p_UserKey)))
select cs;
return qry.ToList();
}
private Expression<Func<Account, bool>> AccountSecurity(int p_UserKey)
{
return (ac => ac.UserAccounts.Any(ua => ua.UserKey == p_UserKey));
}
Where
,Any
等)并不重要,而是它是否是顶级运算符或lambda表达式的一部分。当你意识到在lambda表达式(Expression<Func<…>>
)中,像c => c.Accounts.AsQueryable().Any(this.AccountSecurity(p_UserKey))
这样的东西,在=>
之后的主体实际上并没有被执行时,这就不那么奇怪了。而且IQueryable
翻译器通常不会处理未知方法。 - Ivan Stoev