Asp.net mvc 如何将此SQL转换为Linq语句?

Asp.net mvc 如何将此SQL转换为Linq语句?,asp.net-mvc,linq,linq-to-sql,Asp.net Mvc,Linq,Linq To Sql,我正在开发一种功能,可以向某些用户添加或删除角色。 我在将此SQL代码转换为LINQ时遇到问题。 我已经测试了SQL,它在SQLServerManagementStudio上返回了正确的结果 因为我是LINQ的初学者,所以很难转换SQL语句 /* This sql code works well - returns the users which DO NOT have the role yet in the given company. */ SELECT * FROM SP.AppUser

我正在开发一种功能,可以向某些用户添加或删除角色。 我在将此SQL代码转换为LINQ时遇到问题。 我已经测试了SQL,它在SQLServerManagementStudio上返回了正确的结果

因为我是LINQ的初学者,所以很难转换SQL语句

/* This sql code works well - returns the users which DO NOT have the role yet in the given company. */
SELECT *
FROM SP.AppUser au 
left join
( 
  SELECT distinct auc.AppUserID
   FROM SP.AppUserCompany auc
   inner join SP.AppUserCompanyRole aucr ON aucr.AppUserCompanyID = auc.AppUserCompanyID 
   where auc.CompanyID = 2 and AppRoleID = 4
) AS exist ON exist.AppUserID = au.AppUserID
Where au.AppUserID IN(2088, 38, 1926, 2059, 2058, 1925, 2097, 2061, 2072, 2064) 
and exist.AppUserID is null
//用C#表示实体的示例代码:
AppUser stanley=new AppUser(){AppUserID=1,FirstName=“stanley”};
AppUser jerson=new AppUser(){AppUserID=2,FirstName=“jerson”};
AppUser philip=new AppUser(){AppUserID=3,FirstName=“philip”};
AppUser samantha=new AppUser(){AppUserID=4,FirstName=“samantha”};
AppUserCompany auc1=新的AppUserCompany(){AppUserCompanyID=1,CompanyID=1,AppUser=stanley};
AppUserCompany auc2=新的AppUserCompany(){AppUserCompanyID=2,CompanyID=2,AppUser=stanley};
AppUserCompany auc3=新的AppUserCompany(){AppUserCompanyID=3,CompanyID=1,AppUser=jerson};
AppUserCompany auc4=新的AppUserCompany(){AppUserCompanyID=4,CompanyID=1,AppUser=philip};
AppUserCompany auc5=新的AppUserCompany(){AppUserCompanyID=5,CompanyID=2,AppUser=jerson};
AppUserCompany auc6=新的AppUserCompany(){AppUserCompanyID=6,CompanyID=3,AppUser=stanley};
AppUserCompanyRole aucr1=新的AppUserCompanyRole(){AppUserCompanyRoleID=1,AppUserCompany=auc1,AppRoleID=1};
AppUserCompanyRole aucr2=新的AppUserCompanyRole(){AppUserCompanyRoleID=2,AppUserCompany=auc2,AppRoleID=1};
AppUserCompanyRole aucr3=新的AppUserCompanyRole(){AppUserCompanyRoleID=3,AppUserCompany=auc3,AppRoleID=1};
AppUserCompanyRole aucr4=新的AppUserCompanyRole(){AppUserCompanyRoleID=4,AppUserCompany=auc4,AppRoleID=1};
AppUserCompanyRole aucr5=新的AppUserCompanyRole(){AppUserCompanyRoleID=5,AppUserCompany=auc5,AppRoleID=1};
AppUserCompanyRole aucr6=新的AppUserCompanyRole(){AppUserCompanyRoleID=6,AppUserCompany=auc6,AppRoleID=1};
列表用户=新列表{stanley、jerson、philip、samantha};
List AppUserCompanys=新列表{auc1、auc2、auc3、auc4、auc5、auc6};
List appUserCompanyRoles=新列表{aucr1、aucr2、aucr3、aucr4、aucr5、aucr6};
//以下是我试图获取特定公司中“已经拥有角色”的用户的LINQ代码
var id=新列表{2088,381926,2059,2058,1925,2097,2061,2072,2064};
var usersToDeleteRole=(来自appUserDataBinding.Model中的用户
其中ids.Contains(user.AppUserID)
将appUserCompanyDataBinding.Model on user.AppUserID等于auc.AppUserID中的auc加入groupJoin1
从苏布克
(来自groupJoin1中的auc)
在appUserCompanyRoleDataBinding中加入aucr。auc.AppUserCompanyID上的模型等于aucr.AppUserCompanyID
其中auc.CompanyID==2&&aucr.AppRoleID==4
选择auc)
orderby user.LastName
选择user.ToList();
我的预期结果将是一个LINQ语句,它返回尚未在特定给定公司中担任角色的用户列表。上面我在SSMS上使用的SQL语句,但我不能在C#中的LINQ中使用它-这意味着我需要上面的LINQ代码的“否定”版本

谢谢你的帮助。
干杯。

您可以使用let语句进行子查询

public class AppUser
    {
        public int AppUserID { get; set; }
        public string FirstName { get; set; }
    }

    public class AppUserCompany
    {
        public int AppUserCompanyID { get; set; }
        public int CompanyID { get; set; }
        public AppUser AppUser { get; set; }
    }

    public class AppUserCompanyRole
    {
        public int AppUserCompanyRoleID { get; set; }
        public int AppRoleID { get; set; }
        public AppUserCompany AppUserCompany { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {

            // Sample code in C# to represent the entities:
            AppUser stanley = new AppUser() { AppUserID = 1, FirstName = "Stanley" };
            AppUser jerson = new AppUser() { AppUserID = 2, FirstName = "Jerson" };
            AppUser philip = new AppUser() { AppUserID = 3, FirstName = "Philip" };
            AppUser samantha = new AppUser() { AppUserID = 4, FirstName = "Samantha" };

            AppUserCompany auc1 = new AppUserCompany() { AppUserCompanyID = 1, CompanyID = 1, AppUser = stanley };
            AppUserCompany auc2 = new AppUserCompany() { AppUserCompanyID = 2, CompanyID = 2, AppUser = stanley };
            AppUserCompany auc3 = new AppUserCompany() { AppUserCompanyID = 3, CompanyID = 1, AppUser = jerson };
            AppUserCompany auc4 = new AppUserCompany() { AppUserCompanyID = 4, CompanyID = 1, AppUser = philip };
            AppUserCompany auc5 = new AppUserCompany() { AppUserCompanyID = 5, CompanyID = 2, AppUser = jerson };
            AppUserCompany auc6 = new AppUserCompany() { AppUserCompanyID = 6, CompanyID = 3, AppUser = stanley };

            AppUserCompanyRole aucr1 = new AppUserCompanyRole() { AppUserCompanyRoleID = 1, AppUserCompany = auc1, AppRoleID = 1 };
            AppUserCompanyRole aucr2 = new AppUserCompanyRole() { AppUserCompanyRoleID = 2, AppUserCompany = auc2, AppRoleID = 1 };
            AppUserCompanyRole aucr3 = new AppUserCompanyRole() { AppUserCompanyRoleID = 3, AppUserCompany = auc3, AppRoleID = 1 };
            AppUserCompanyRole aucr4 = new AppUserCompanyRole() { AppUserCompanyRoleID = 4, AppUserCompany = auc4, AppRoleID = 1 };
            AppUserCompanyRole aucr5 = new AppUserCompanyRole() { AppUserCompanyRoleID = 5, AppUserCompany = auc5, AppRoleID = 1 };
            AppUserCompanyRole aucr6 = new AppUserCompanyRole() { AppUserCompanyRoleID = 6, AppUserCompany = auc6, AppRoleID = 1 };

            List<AppUser> users = new List<AppUser> { stanley, jerson, philip, samantha };
            List<AppUserCompany> appUserCompanies = new List<AppUserCompany> { auc1, auc2, auc3, auc4, auc5, auc6 };
            List<AppUserCompanyRole> appUserCompanyRoles = new List<AppUserCompanyRole> { aucr1, aucr2, aucr3, aucr4, aucr5, aucr6 };
            var ids = new List<int> { 2088, 38, 1926, 2059, 2058, 1925, 2097, 2061, 2072, 2064 };

            var result = from au in users
                         let appUserIDs = (from auc in appUserCompanies
                                           join aucr in appUserCompanyRoles on auc.AppUserCompanyID equals aucr.AppUserCompany.AppUserCompanyID
                                           where auc.CompanyID == 2 && aucr.AppRoleID == 4 && auc.AppUser.AppUserID == au.AppUserID
                                           select auc.AppUser.AppUserID).Distinct()
                         where  appUserIDs.Count() == 0  && ids.Contains(au.AppUserID)
                         select au;
公共类AppUser
{
public int AppUserID{get;set;}
公共字符串名{get;set;}
}
公共类AppUserCompany
{
公共int-AppUserCompanyID{get;set;}
public int CompanyID{get;set;}
公共AppUser AppUser{get;set;}
}
公共类AppUserCompanyRole
{
public int-AppUserCompanyRoleID{get;set;}
public int AppRoleID{get;set;}
公共AppUserCompany AppUserCompany{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
//用C#表示实体的示例代码:
AppUser stanley=new AppUser(){AppUserID=1,FirstName=“stanley”};
AppUser jerson=new AppUser(){AppUserID=2,FirstName=“jerson”};
AppUser philip=new AppUser(){AppUserID=3,FirstName=“philip”};
AppUser samantha=new AppUser(){AppUserID=4,FirstName=“samantha”};
AppUserCompany auc1=新的AppUserCompany(){AppUserCompanyID=1,CompanyID=1,AppUser=stanley};
AppUserCompany auc2=新的AppUserCompany(){AppUserCompanyID=2,CompanyID=2,AppUser=stanley};
AppUserCompany auc3=新的AppUserCompany(){AppUserCompanyID=3,CompanyID=1,AppUser=jerson};
AppUserCompany auc4=新的AppUserCompany(){AppUserCompanyID=4,CompanyID=1,AppUser=philip};
AppUserCompany auc5=新的AppUserCompany(){AppUserCompanyID=5,CompanyID=2,AppUser=jerson};
AppUserCompany auc6=新的AppUserCompany(){AppUserCompanyID=6,CompanyID=3,AppUser=stanley};
AppUserCompanyRole aucr1=新的AppUserCompanyRole(){AppUserCompanyRoleID=1,AppUserCompany=auc1,AppRoleID=1};
AppUserCompanyRole aucr2=新的AppUserCompanyRole(){AppUserCompanyRoleID=2,AppUserCompany=auc2,AppRoleID=1};
AppUserCompanyRole aucr3=新的AppUserCompanyRole(){AppUserCompanyRoleID=3,AppUserCompany=auc3,AppRoleID=1};
AppUserCompanyRole aucr4=新的AppUserCompanyRole(){AppUserCompanyRoleID=4,AppUserCompany=auc4,AppRoleID=1};
AppUserCompanyRole aucr5=新的AppUserCompanyRole(){AppUserCompanyRoleID=5,AppUserCompany=auc5,AppRoleID=1};
AppUserCompanyRole aucr6=新的AppUserCompanyRole(){AppUserCompanyRoleID=6,AppUserCompany=auc6,AppRoleID=1};
列表用户=新列表{stanley、jerson、philip、samantha};
List AppUserCompanys=新列表{auc1、auc2、auc3、auc4、auc5、auc6};
列表appUserCompanyRoles=n
public class AppUser
    {
        public int AppUserID { get; set; }
        public string FirstName { get; set; }
    }

    public class AppUserCompany
    {
        public int AppUserCompanyID { get; set; }
        public int CompanyID { get; set; }
        public AppUser AppUser { get; set; }
    }

    public class AppUserCompanyRole
    {
        public int AppUserCompanyRoleID { get; set; }
        public int AppRoleID { get; set; }
        public AppUserCompany AppUserCompany { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {

            // Sample code in C# to represent the entities:
            AppUser stanley = new AppUser() { AppUserID = 1, FirstName = "Stanley" };
            AppUser jerson = new AppUser() { AppUserID = 2, FirstName = "Jerson" };
            AppUser philip = new AppUser() { AppUserID = 3, FirstName = "Philip" };
            AppUser samantha = new AppUser() { AppUserID = 4, FirstName = "Samantha" };

            AppUserCompany auc1 = new AppUserCompany() { AppUserCompanyID = 1, CompanyID = 1, AppUser = stanley };
            AppUserCompany auc2 = new AppUserCompany() { AppUserCompanyID = 2, CompanyID = 2, AppUser = stanley };
            AppUserCompany auc3 = new AppUserCompany() { AppUserCompanyID = 3, CompanyID = 1, AppUser = jerson };
            AppUserCompany auc4 = new AppUserCompany() { AppUserCompanyID = 4, CompanyID = 1, AppUser = philip };
            AppUserCompany auc5 = new AppUserCompany() { AppUserCompanyID = 5, CompanyID = 2, AppUser = jerson };
            AppUserCompany auc6 = new AppUserCompany() { AppUserCompanyID = 6, CompanyID = 3, AppUser = stanley };

            AppUserCompanyRole aucr1 = new AppUserCompanyRole() { AppUserCompanyRoleID = 1, AppUserCompany = auc1, AppRoleID = 1 };
            AppUserCompanyRole aucr2 = new AppUserCompanyRole() { AppUserCompanyRoleID = 2, AppUserCompany = auc2, AppRoleID = 1 };
            AppUserCompanyRole aucr3 = new AppUserCompanyRole() { AppUserCompanyRoleID = 3, AppUserCompany = auc3, AppRoleID = 1 };
            AppUserCompanyRole aucr4 = new AppUserCompanyRole() { AppUserCompanyRoleID = 4, AppUserCompany = auc4, AppRoleID = 1 };
            AppUserCompanyRole aucr5 = new AppUserCompanyRole() { AppUserCompanyRoleID = 5, AppUserCompany = auc5, AppRoleID = 1 };
            AppUserCompanyRole aucr6 = new AppUserCompanyRole() { AppUserCompanyRoleID = 6, AppUserCompany = auc6, AppRoleID = 1 };

            List<AppUser> users = new List<AppUser> { stanley, jerson, philip, samantha };
            List<AppUserCompany> appUserCompanies = new List<AppUserCompany> { auc1, auc2, auc3, auc4, auc5, auc6 };
            List<AppUserCompanyRole> appUserCompanyRoles = new List<AppUserCompanyRole> { aucr1, aucr2, aucr3, aucr4, aucr5, aucr6 };
            var ids = new List<int> { 2088, 38, 1926, 2059, 2058, 1925, 2097, 2061, 2072, 2064 };

            var result = from au in users
                         let appUserIDs = (from auc in appUserCompanies
                                           join aucr in appUserCompanyRoles on auc.AppUserCompanyID equals aucr.AppUserCompany.AppUserCompanyID
                                           where auc.CompanyID == 2 && aucr.AppRoleID == 4 && auc.AppUser.AppUserID == au.AppUserID
                                           select auc.AppUser.AppUserID).Distinct()
                         where  appUserIDs.Count() == 0  && ids.Contains(au.AppUserID)
                         select au;