【问题标题】:How to solve this Error in Linq : Operator '!=' cannot be applied to operands of type 'int' and 'System.Linq.IQueryable<int>'如何解决 Linq 中的此错误:运算符“!=”不能应用于“int”和“System.Linq.IQueryable<int>”类型的操作数
【发布时间】:2019-01-28 19:13:34
【问题描述】:
var ll = from a in db.EmployeeMasters
         where a.EmployeeID != (from d in db.EmployeeMasters
                                join c in db.PerformanceDetails on d.EmployeeID equals c.EmployeeID
                                join z in db.ProjectMasters on c.ProjectID equals z.ProjectID
                                into ss
                                from z in ss.DefaultIfEmpty()
                                where z.ProjectName == name || z.ProjectName == name1
                                select d.EmployeeID)
         select a.EmployeeName;

它返回如下错误消息

运算符“!=”不能应用于“int”和“System.Linq.IQueryable”类型的操作数

我想在 http post 方法中添加这个 Linq 查询以在 postman 中查看输出 任何人请帮我解决这个问题

实际问题是选择不属于 2 个项目(如(CRM、自动化))的员工

两个项目员工的一部分在另一个项目中,但一些员工不在任何项目中

这里显示了我的实体框架数据模型:

name 和 name1 是项目名称的参数

【问题讨论】:

  • .....select d.EmployeeID).First()
  • 对不起兄弟 (.....).First() 在 Postman 中显示错误。它说使用 (....).FirstOrDefault()。它工作得很好,兄弟。但是,输出显示错误的输出,例如所选项目中的某些员工姓名我想查看不属于所选 2 个项目的员工姓名 -
  • 如果我的查询中有任何错误,请说我有一个 sql 查询来解决这个问题。但我无法将其转换为 Linq
  • select a.EmployeeName from EmployeeMaster a where a.employeeid not in (select bb.EmployeeID from EmployeeMaster bb left join PerformanceDetail nn on bb.EmployeeID = nn.EmployeeID left join ProjectMaster mm on nn.ProjectID= mm.ProjectID 其中 mm.ProjectName='Automation' 或 mm.ProjectName='CRM Customer')

标签: linq sql-server-2012 entity-framework-4


【解决方案1】:

你让这件事变得比必要的困难得多。首先,您应该使用 EF 为您创建的这些导航属性,而不是使用冗长且容易出错的连接语句。这样做,编写一个大大简化的谓词就容易多了:

var ll = from a in db.EmployeeMasters
         where !a.PerformanceDetails
                 .Any(pd => pd.ProjectMaster.ProjectName == name 
                         || pd.ProjectMaster.ProjectName == name1)
         select a.EmployeeName;

这是一个不同的查询——它转换为EXISTS——但结果是一样的,查询计划甚至可能更好。此外,如果需要,以后添加更多谓词会更容易。

【讨论】:

  • 没错,你的要求更好,我只关注问题的解决而不是优化。
  • 想解释一下您为什么不接受这个?我可以做些什么来更好地满足您的要求?
【解决方案2】:
 int[] EmployeeIDs = (from em in db.EmployeeMasters
                             join pd in db.PerformanceDetails on em.EmployeeID equals pd.EmployeeID into pdRes
                             from pdResult in pdRes.DefaultIfEmpty()
                             join pm in db.ProjectMasters on pdResult.ProjectID equals pm.ProjectID into pmRes
                             from pmResult in pmRes.DefaultIfEmpty()
                             where (pmResult.ProjectName == "Automation" || pmResult.ProjectName == "CRM Customer")
                             select em.EmployeeID
                           ).Distinct().ToArray();

        var empResult = (from em in db.EmployeeMasters
                         where !EmployeeIDs.Contains(em.EmployeeID)
                         select new
                         {
                             EmployeeName = em.EmployeeName
                         }).ToList();

【讨论】:

    【解决方案3】:

    你的问题不是很清楚,但错误很清楚,你不能比较类型intSystem.Linq.IQueryable&lt;int&gt;

    我假设你想要这样的东西:

    var ll = from a in db.EmployeeMasters
             where !(from d in db.EmployeeMasters
                    join c in db.PerformanceDetails on d.EmployeeID equals c.EmployeeID
                    join z in db.ProjectMasters on c.ProjectID equals z.ProjectID
                    into ss
                    from z in ss.DefaultIfEmpty()
                    where z.ProjectName == name || z.ProjectName == name1
                    select d.EmployeeID).Contains(a.EmployeeID)
             select a.EmployeeName;
    

    我们正在这里寻找未出现在您的查询结果中的EmployeeIDs。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多