C# Inline If Else抛出System.ArgumentException:参数类型不匹配

C# Inline If Else抛出System.ArgumentException:参数类型不匹配,c#,entity-framework,entity-framework-core,ef-core-2.0,C#,Entity Framework,Entity Framework Core,Ef Core 2.0,我有以下片段: var a = dbContext.Employees.AsQueryable(); var b = dbContext.Employees.Where(x => x.IsManager == 1); var results = dbContext.Companies .SelectMany(x => x.IsActive == 1 ? a : b) .Select(x =&g

我有以下片段:

var a = dbContext.Employees.AsQueryable();
var b = dbContext.Employees.Where(x => x.IsManager == 1);
var results = dbContext.Companies
                       .SelectMany(x => x.IsActive == 1 ? a : b)
                       .Select(x => x.Id);
我原以为它会毫无问题地执行,但有趣的是,我得到了这个错误:

失败:Microsoft.AspNetCore.Server.Kestrel[13] 连接id“0HLQ6AD1S5ITB”,请求id“0HLQ6AD1S5ITB:00000001”:应用程序引发了未处理的异常。 System.ArgumentException:参数类型不匹配 at System.Linq.Expressions.Expression.Condition(表达式测试、表达式ifTrue、表达式ifFalse、类型) 在System.Linq.Expressions.ConditionalExpression.Update(表达式测试、表达式ifTrue、表达式ifFalse) 位于System.Linq.Expressions.ExpressionVisitor.VisitConditional(条件表达式节点) at System.Linq.Expressions.conditionalPression.Accept(ExpressionVisitor) 位于System.Linq.Expressions.ExpressionVisitor.Visite(表达式节点) 位于Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.ReplaceClaureReferences(表达式表达式、IQuerySource查询源、布尔inProjection) 在Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.CompileAdditionalFromClauseExpression(AdditionalFromClause AdditionalFromClause,QueryModel QueryModel) 在Microsoft.EntityFrameworkCore.Query.RelationalQueryModelVisitor.CompileAdditionalFromClauseExpression(AdditionalFromClause AdditionalFromClause,QueryModel QueryModel) 在Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.VisitAdditionalFromClause(AdditionalFromClause-fromClause,QueryModel-QueryModel,Int32索引) 位于Microsoft.EntityFrameworkCore.Query.RelationalQueryModelVisitor.VisitaditionalFromClause(AdditionalFromClause-fromClause,QueryModel-QueryModel,Int32索引) at Remotion.Linq.子句.AdditionalFromClause.Accept(IQueryModelVisitor、QueryModelQueryModel、Int32索引) at Remotion.Linq.querymodevisitorbase.VisitBodyClauses(observedcollection`1 bodyClauses,QueryModel QueryModel) 在Remotion.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel QueryModel) 位于Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.VisitQueryModel(QueryModel QueryModel) 位于Microsoft.EntityFrameworkCore.Query.RelationalQueryModelVisitor.VisitQueryModel(QueryModel QueryModel) 位于Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor.CreateQueryExecutor[TResult](QueryModel QueryModel) 位于Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](QueryModel QueryModel)

我不确定这里出了什么问题,尤其是这段代码工作正常,结果正确:

var a = dbContext.Employees.AsQueryable();
var results = dbContext.Companies
                       .SelectMany(x => a)
                       .Select(x => x.Id);
单凭这个剪掉也很好:

var b = dbContext.Employees.Where(x => x.IsManager == 1);
var results = dbContext.Companies
                       .SelectMany(x => b)
                       .Select(x => x.Id);
另外,我正在使用EF Core 2.2


更新1

好的,我试图用上面的例子来简化我的问题,但我认为这不是一个好主意

这就是我实际拥有的:我有三个主要实体:
Post
Employee
,和,
WorkGroup
,以及三个映射实体:
EmployeeWorkGroup
postmployee
,和
PostWorkGroup
。这六个实体的执行情况如下:

class Post {
    public Guid Id { get; set; }
    public int IsGlobal { get; set; }
    public virtual ICollection<PostEmployee> Employees { get; set; }
    public virtual ICollection<PostWorkGroup> WorkGroups { get; set; }
}

class Employee {
    public Guid Id { get; set; }
}

class WorkGroup {
    public Guid Id { get; set; }
    public Guid? ParentId { get; set; }
    public string Prefix { get; set; }
}

class EmployeeWorkGroup {
    public Guid EmployeeId { get; set; }
    public Guid WorkGroupId { get; set; }
    public virtual Employee Employee { get; set }
    public virtual WorkGroup WorkGroup { get; set; }
}

class PostEmployee {
    public Guid EmployeeId { get; set; }
    public Guid PostId { get; set; }
    public virtual Employee Employee { get; set }
    public virtual Post Post { get; set; }
}

class PostWorkGroup {
    public Guid WorkGroupId { get; set; }
    public Guid PostId { get; set; }
    public virtual WorkGroup WorkGroup { get; set; }
    public virtual Post Post { get; set; }
}
在没有条件的情况下,我可以完美地执行if-else的任意一边

另外,我用的是LinqKit


更新2

这是我通过执行上面的代码得到的查询(我删除了if-else的一侧以使其工作):

选择[x0].[id]
从[posts]到[x]
交叉连接[员工]为[x0]
其中([x].[is_deleted]1)和([x0].[is_deleted]1))和([x0].[id]在(
选择不同的[workGroup.Employees].[employeer\u id]
来自[工作组]作为[x1]
将[employees\u work\u groups]作为[x1].[id]=[workGroup.employees].[work\u group\u id]上的[workGroup.employees]进行内部联接
其中([x1].[is_deleted]1)和存在(
选择1
从[work\u groups\u posts]作为[postWorkGroup]
内连接(
选择[x2]*
来自[工作组]作为[x2]
其中[x2].[is_deleted]1
)作为[postWorkGroup]上的[t]。[work\u group\u id]=[t]。[id]
其中([x1].[prefix]类似于[t].[prefix]+N'%”和(左([x1].[prefix],左([t].[prefix])=[t].[prefix])或([t].[prefix]=N'')和([x].[id]=[postWorkGroup].[post_id]),并且不存在(
选择1
从[employees_posts]起,作为[b]
其中([b].[employee_id]=[workGroup.Employees].[employee_id])和([x].[id]=[b].[post_id]))
)或中的[x0].[id](
选择[x3]。[employee\u id]
从[employees_posts]到[x3]
其中[x].[id]=[x3].[post\u id]
))

x.IsActive的类型是什么?它看起来是布尔型的,你将它与一个int进行比较。
x.IsActive==1有什么意义?a:a
?无论结果如何,都会返回相同的值condition@Cid它是一个int而不是布尔值,是的,我知道相同的值,但它应该工作,不是吗?
x.IsActive==1?答:a
这里的检查条件有什么用,因为true和false具有相同的语句?@m2008m1033m您要求人们猜测您的实体和表是什么样子的,以及为什么看起来像no op的语句的行为方式是这样的。这是真实的代码还是“看起来”像它的东西?您要求人们猜测,例如
dbContext.Employees.Where(e=>e.Company.IsActive==1 | |(e.Company.IsActive!=1&&e.IsManager==1)。选择(e=>e.ID)
将获得员工ID。
.Distinct(e=>e.Company.ID)
将为您获取不同的公司ID。
x.IsActive
的类型是什么?它似乎是布尔值,您可以将其与int进行比较。
x.IsActive==1有什么意义?a:a
?无论结果如何,都会返回相同的值condition@Cid这是一个整数,不是布尔值,是的,我知道相同的值,但它应该有用,是不是应该?
x.IsActive==1?a:a
在这里检查条件true和false有什么用
// get all employee ids from the posts work groups
Expression<Func<Post, IEnumerable<Guid>>> postEmployeesFromWorkGroups = post =>
    allWorkGroups
        .Where(workGroup => post.WorkGroups
            .Any(postWorkGroup => workGroup.Prefix.StartsWith(postWorkGroup.WorkGroup.Prefix)))
        .SelectMany(y => y.Employees
            .Where(z => !post.Employees.Any(b => b.EmployeeId.Equals(z.EmployeeId))))
        .Select(y => y.EmployeeId)
        .Distinct();

// get all employee ids from posts' immediate employees list
Expression<Func<Post, IEnumerable<Guid>>> postEmployees = post => post.Employees.Select(x => x.EmployeeId);

// return the results
public static Expression<Func<Post, IEnumerable<Employee>>> var predicate = post => post.IsGlobal == 1
    ? allEmployees
    : allEmployees.Where(x =>
        postEmployeesFromWorkGroups.Invoke(post).Contains(x.Id) ||
        postEmployees.Invoke(post).Contains(x.Id));


db.Posts.AsExpandable().Where(x=>x.Id.Equals("some-id")).Select(predicate);
SELECT [x0].[id]
FROM [posts] AS [x]
CROSS JOIN [employees] AS [x0]
WHERE (([x].[is_deleted] <> 1) AND ([x0].[is_deleted] <> 1)) AND ([x0].[id] IN (
  SELECT DISTINCT [workGroup.Employees].[employee_id]
  FROM [work_groups] AS [x1]
  INNER JOIN [employees_work_groups] AS [workGroup.Employees] ON [x1].[id] = [workGroup.Employees].[work_group_id]
  WHERE (([x1].[is_deleted] <> 1) AND EXISTS (
      SELECT 1
      FROM [work_groups_posts] AS [postWorkGroup]
      INNER JOIN (
          SELECT [x2].*
          FROM [work_groups] AS [x2]
          WHERE [x2].[is_deleted] <> 1
      ) AS [t] ON [postWorkGroup].[work_group_id] = [t].[id]
      WHERE (([x1].[prefix] LIKE [t].[prefix] + N'%' AND (LEFT([x1].[prefix], LEN([t].[prefix])) = [t].[prefix])) OR ([t].[prefix] = N'')) AND ([x].[id] = [postWorkGroup].[post_id]))) AND NOT EXISTS (
      SELECT 1
      FROM [employees_posts] AS [b]
      WHERE ([b].[employee_id] = [workGroup.Employees].[employee_id]) AND ([x].[id] = [b].[post_id]))
) OR [x0].[id] IN (
  SELECT [x3].[employee_id]
  FROM [employees_posts] AS [x3]
  WHERE [x].[id] = [x3].[post_id]
))