LINQ 查询 WHERE IN 子句

LINQ query for WHERE IN clasue

我有 4 个表 TransactionsAttachmentSubReportTypeSubRepRole。我的缓存上有用户角色。我想要那些与用户角色相关的附件[一个用户可能有多个角色]

List<int> userrole = new List<int>();
UserContext user_details = (UserContext)HttpContext.Current.Cache["UserContext"];
IList<UserRole> userrole_id = user_details.UserRoleModuleWise;

var  query = (from trans in objContext.Transactions
             join attch in objContext.Attachment on trans.TransId equals attch.TransId
             join subrept in objContext.SubReportType on trans.SubRepId equals subrept.SubRepId
             join subreprl in objContext.SubRepRole on trans.SubRepId equals subreprl.SubRepId
             join selectedrole in userrole_id  on subreprl.RoleId equals selectedrole.RoleId
             /*where obj.Contains(subreprl.RoleId) */orderby trans.TransDate
           select new AttachmentModel
           {
               Createdate = attch.CreatedDateTime,
               FileType = attch.FileType,
               FileName = attch.FileName,
               Attachid = attch.AttachedId,
               FileTag = attch.FileTag,
               Transid = trans.TransId,
               SubReportName = subrept.SubRepName,
               RandomPinNo = attch.FileRandomPin
           }).ToList();

现在出现此错误:

Unable to create a constant value of type 'User.Common.DataContract.UserRole'. Only primitive types or enumeration types are supported in this context.

请帮忙解决这个问题。也尝试了 "Contains",但出现了类型转换错误。只是想要那些角色在 user_details.UserRoleModuleWise 中的记录。 user_details.UserRoleModuleWise 是一个包含 RoleId 和 RoleName 的数组

您需要将 Contains 与正确值的数组一起使用:

where user_details.UserRoleModuleWise.Select(urmw => urmw.RoleId).ToArray().Contains(aRoleId => aRoleId == subreprl.RoleId)

创建了一个公共 class --

 object[] common_data = new object[4];
     UserContext user_details = (UserContext)HttpContext.Current.Cache["UserContext"];
        List<UserRole> userrole_id = user_details.UserRoleModuleWise.ToList();
       int[] roleid = { -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20 };
        string[] rolename = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" };
        for (int i = 0; i < userrole_id.Count; i++)
            {
                roleid[i] = Convert.ToInt32(userrole_id[i].RoleId);
                rolename[i] = Convert.ToString(userrole_id[i].RoleName);
                r_id.Add(roleid[i], rolename[i]);
            }
            common_data[0] = roleid; 
            common_data[1] = rolename; 
           //common_data[2] = username; 
           common_data[3] = userrole_id.Count;

然后在我的存储库中我使用了 -

        User_common_data ucd = new User_common_data();
        object[] ucd_data = ucd.user_common_details();
        int[] roles = (int[]) ucd_data[0];

        var query = (from obj in objContext.ReportType
                     join obj1 in objContext.SubReportType on obj.RepId equals obj1.RepId
                     join obj2 in objContext.SubRepRole on obj1.SubRepId equals obj2.SubRepId
                     where roles.Contains(obj2.RoleId)
                     select new ReportTypeModel
                     {
                         RepId = obj.RepId,
                         RepName = obj.RepName,
                         RepCode = obj.RepCode
                     }).ToList();

现在工作正常。 @NetMage 的回答也有效...谢谢