【问题标题】:I'm getting an error when trying to join against multiple tables in a query尝试加入查询中的多个表时出现错误
【发布时间】:2017-09-28 07:52:35
【问题描述】:

我在加入时收到此错误:

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,

是否有可能为此授权委托

【问题讨论】:

  • 您可以尝试在var rightsList 行上将.AsEnumerable(); 更改为.ToList();,从而强制它加载到内存中,看看它是否能解决您的问题(尽管如果表很大,它不会一个理想的解决方案)。

标签: c# linq


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2020-10-29
    • 2013-10-18
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多