首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >联接错误|无法创建仅原语类型的常量值

联接错误|无法创建仅原语类型的常量值
EN

Stack Overflow用户
提问于 2018-08-29 03:11:14
回答 1查看 358关注 0票数 1

这里是LINQ的新手。

我的表(TableA)中有以下数据:

代码语言:javascript
复制
ID  Name      SubmissionNo
1   Jim       A-1
2   Andy      A-2
3   Rick      A-2
4   Mary      A-3
5   Zim       A-4
6   Loren     A-1

然后,我需要创建一个查询,它将允许我从该表中获取那些具有重复提交编号的记录。

到目前为止,我的解决方案如下(Context是数据库上下文):

代码语言:javascript
复制
var duplicates = (from tbl in Context.TableA.AsNoTracking()
                  group tbl by tbl.SubmissionNo into grp
                  select new { count = grp.Count(), submissionNo = grp.Key})
                 .Where(x => x.count > 1)
                 .OrderBy(y => y.submissionNo).ToList();

然后,变量duplicates包含以下记录:

代码语言:javascript
复制
count  submissionNo
2      A-1
2      A-2

然后,我编写主查询,它将允许我从具有重复submissionNo的TableA中获取所有记录

代码语言:javascript
复制
var myList = (from tbl in Context.TableA.AsNoTracking()
              join dup in duplicates on tbl.SubmissionNo equals dup.submissionNo
              select new 
              { 
                ID = tbl.ID, 
                Name = tbl.Name, 
                SubmissionNo = tbl.SubmissionNo 
              })
              .ToList();

然后,我得到了一个关于myList查询的错误

无法创建“匿名类型”类型的常量值。在此上下文中仅支持基元类型或枚举类型。

我认为肯定有更好的方法来做这件事,就像上面的TableA一样,我实际上希望得到以下结果:

代码语言:javascript
复制
ID  Name      SubmissionNo
1   Jim       A-1
2   Andy      A-2
3   Rick      A-2
6   Loren     A-1
EN

回答 1

Stack Overflow用户

发布于 2018-08-29 03:27:16

由于实体框架不支持将内存中的对象集合与数据库集合联接,因此一种常见的解决方法是使用Contains进行筛选。

首先,您需要获取要过滤的ID:

代码语言:javascript
复制
var duplicates = (from tbl in Context.TableA.AsNoTracking()
                  group tbl by tbl.SubmissionNo into grp
                  select new { count = grp.Count(), submissionNo = grp.Key})
                 .Where(x => x.count > 1)
                 .OrderBy(y => y.submissionNo)
                 .ToList();
var duplicateIds = duplicates.Select(x => x.submissionNo).ToList();

然后更改您的查询以执行WHERE...IN而不是JOIN

代码语言:javascript
复制
var myList = (from tbl in Context.TableA.AsNoTracking()
              where duplicateIDs.Contains(tbl.SubmissionNo)
              select new 
              { 
                ID = tbl.ID, 
                Name = tbl.Name, 
                SubmissionNo = tbl.SubmissionNo 
              })
              .ToList();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52064791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档