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 我认为运算符(WhereAny 等)并不重要,但它是***运算符还是 lambda 表达式的一部分。当您意识到在像c =&gt; c.Accounts.AsQueryable().Any(this.AccountSecurity(p_UserKey)) 这样的lambda 表达式(Expression&lt;Func&lt;…&gt;&gt;)中,实际上没有执行主体(在=&gt; 之后)时,这并不奇怪。而IQueryable的译者通常不会处理未知方法。

以上是关于System.Core 错误:使用 C# Entity Framework 和 Linq 和 Expression 的“代码应该无法访问”的主要内容,如果未能解决你的问题,请参考以下文章

sql的列的说明

在 .Net 3.5 中使用 Ninject 时 System.Core 的 System.Io.FileNotFoundException

T4模板循环生成插入语句

使用两个不同的外键连接两个表以获得相同的字段

实体生成

t4 根据表名数组生成实体