我在尝试连接查询中的多个表时遇到错误

时间:2017-09-28 07:52:36

标签: c# linq

我加入时收到此错误:

  

EntityFramework.SqlServer.dll中发生了'System.NotSupportedException'类型的异常,但未在用户代码中处理

附加信息:指定的LINQ表达式包含对与不同上下文关联的查询的引用。

 var rightsList = RoleRightService.GetRoleRights<RoleRight>().Where(x => x.RoleCode == role && x.CompanyId == USER_OBJECT.CompanyId).AsEnumerable();

 var securables = SecurableServices.GetSecurable<Securable>()
                        .GroupBy(a => new { a.RegistrationType_LookUpId })
                        .Select(r => new
                        {
                            id = r.Select(x => x.SecurableID),
                            registrationType = r.Key.RegistrationType_LookUpId,
                            RegistrationTypeName = r.Select(x => x.RegistrationType.LookUpDescription).Distinct().FirstOrDefault(),
                            IsChecked = false,
                            pageList = r.GroupBy(b => new { b.PageID })
                                .Select(p => new SecurableViewModel
                                {
                                    Id = p.Where(x => x.PageID == p.Key.PageID && x.Type == 1).Select(x => x.SecurableID).FirstOrDefault(),
                                    PageId = p.Where(x => x.PageID == p.Key.PageID && x.Type == 1).Select(x => x.PageID).FirstOrDefault(),
                                    PageName = p.Where(x => x.PageID == p.Key.PageID && x.Type == 1).Select(x => x.PageDescription).FirstOrDefault(),// && rr.AccessRight !=0
                                    IsChecked = rightsList.Where(rr => rr.SecurableID == (p.Where(x => x.PageID == p.Key.PageID && x.Type == 1).Select(x => x.SecurableID).FirstOrDefault())).Count() > 0,
                                    operationList = r.Where(x => x.PageID == p.Key.PageID && x.Type == 2)
                                    .Select(o => new RoleRightViewModel
                                    {
                                        Id = o.SecurableID,
                                        OperationID = o.OperationID,
                                        OperationName = o.OperationDescription,
                                        IsChecked = rightsList.Where(rr => rr.SecurableID == o.SecurableID).Count() > 0,
                                    })
                                    .ToList()
                                }).ToList()
                        }).ToList();

我收到错误

  

指定的LINQ表达式包含对与不同上下文关联的查询的引用。

对于这一行:

IsChecked = rightsList.Where(rr => rr.SecurableID == (p.Where(x => x.PageID == p.Key.PageID && x.Type == 1).Select(x => x.SecurableID).FirstOrDefault())).Count() > 0,

是否可以为此

代表权利

1 个答案:

答案 0 :(得分:0)

看起来您正在使用多个EF实体上下文,可能会查询多个数据库。 EF无法跨多个EF上下文执行linq to entity查询。

为了在没有错误的情况下执行此查询,需要将linq用于对象,而不是在组合它们之前将数据从每个上下文投影到内存中。请注意,这可能会对性能产生负面影响,因为在过滤之前需要将所有对象提取到内存中。

尝试在GroupBy和Select语句之间添加.ToList()

var securables = SecurableServices.GetSecurable<Securable>()
    .GroupBy(a => new { a.RegistrationType_LookUpId })
    .ToList()                
    .Select(r => new
    ...