How to solve this Error in Linq : Operator &#39;!=&#39; cannot be applied to operands of type &#39;int&#39; and &#39;System.Linq.IQueryable<int>&#39;

时间:2018-08-22 13:44:29

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

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;

It returns an error messages like below

Operator '!=' cannot be applied to operands of type 'int' and 'System.Linq.IQueryable'

I want to add this Linq query in http post method to view output in postman Anyone Please help me to solve this

Actual question is select employees who are not part of 2 projects like (CRM, Automation)

Part of both project employees are in another project but some of the employees not in any projects

My Entity Framework Data Model is shown here:

enter image description here

name and name1 are given parameters for project names

3 个答案:

答案 0 :(得分:2)

您正在为此付出不必要的努力。首先,您应该使用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,但是结果是相同的,查询计划甚至可能更好。另外,如有必要,在以后添加更多谓词也容易得多。

答案 1 :(得分:1)

您的问题尚不清楚,但错误非常清楚,您无法比较类型intSystem.Linq.IQueryable<int>

我认为您想要这样的东西:

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;

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

答案 2 :(得分:0)

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