使用C# Entity Framework和Linq表达式时,出现System.Core错误:“代码应该是不可达的”。

8
执行以下 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个回答

7

作为一种解决方法,您可以将方法调用捕获到查询表达式树之外的变量中,并在内部使用该变量:

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();

这并没有解决我的问题。还是一样的错误。感谢您的贡献。 - SteveB
EF就是EF。这对我很有用,但我在Where和Select中都使用了这个表达式,所以我必须在两个地方都替换才能使其正常工作。 - Edgar Froes
令我惊讶的是,首先使用一个变量就解决了问题!非常感谢! - ppenchev
谢谢,这对于任何方法都有帮助,但对于Where不需要。奇怪的效果。 - VikciaR
@VikciaR 我认为运算符(Where, Any等)并不重要,而是它是否是顶级运算符或lambda表达式的一部分。当你意识到在lambda表达式(Expression<Func<…>>)中,像c => c.Accounts.AsQueryable().Any(this.AccountSecurity(p_UserKey))这样的东西,在=>之后的主体实际上并没有被执行时,这就不那么奇怪了。而且IQueryable翻译器通常不会处理未知方法。 - Ivan Stoev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接