System.Core 错误:使用 C# Entity Framework 和 Linq 和 Expression 的“代码应该无法访问”
Posted
技术标签:
【中文标题】System.Core 错误:使用 C# Entity Framework 和 Linq 和 Expression 的“代码应该无法访问”【英文标题】:System.Core error: "Code supposed to be unreachable" using C# Entity Framework and Linq with Expression 【发布时间】:2018-04-14 04:45:08 【问题描述】:在执行以下 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));
【问题讨论】:
【参考方案1】:作为一种解决方法,您可以将方法调用捕获到查询表达式树之外的变量中,并在内部使用该变量:
var accountFilter = this.AccountSecurity(p_UserKey);
var qry = from cs in this.DbContext.CompanySet
.Where(c => c.Accounts.AsQueryable().Any(accountFilter))
select cs;
return qry.ToList();
【讨论】:
这并不能解决我的问题。同样的错误。感谢您的贡献。 EF 是 EF。这对我有用,但我在 Where 和 Select 中使用了表达式,所以我必须在这两个地方替换它才能工作。 令我惊讶的是,首先使用变量就可以了!非常感谢! 谢谢,它对任何方法都有帮助,但对于 Where 不需要。奇怪的效果。 @VikciaR 我认为运算符(Where
、Any
等)并不重要,但它是***运算符还是 lambda 表达式的一部分。当您意识到在像c => c.Accounts.AsQueryable().Any(this.AccountSecurity(p_UserKey))
这样的lambda 表达式(Expression<Func<…>>
)中,实际上没有执行主体(在=>
之后)时,这并不奇怪。而IQueryable
的译者通常不会处理未知方法。以上是关于System.Core 错误:使用 C# Entity Framework 和 Linq 和 Expression 的“代码应该无法访问”的主要内容,如果未能解决你的问题,请参考以下文章
在 .Net 3.5 中使用 Ninject 时 System.Core 的 System.Io.FileNotFoundException