这里是LINQ的新手。
我的表(TableA)中有以下数据:
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是数据库上下文):
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包含以下记录:
count submissionNo
2 A-1
2 A-2
然后,我编写主查询,它将允许我从具有重复submissionNo的TableA中获取所有记录
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一样,我实际上希望得到以下结果:
ID Name SubmissionNo
1 Jim A-1
2 Andy A-2
3 Rick A-2
6 Loren A-1
发布于 2018-08-29 03:27:16
由于实体框架不支持将内存中的对象集合与数据库集合联接,因此一种常见的解决方法是使用Contains
进行筛选。
首先,您需要获取要过滤的ID:
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
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();
https://stackoverflow.com/questions/52064791
复制相似问题