如何使用实体框架中的 DBContext 获取在另一列中具有重复数据的所有 ID?

Posted

技术标签:

【中文标题】如何使用实体框架中的 DBContext 获取在另一列中具有重复数据的所有 ID?【英文标题】:How to fetch all ID which has duplicate data in another column using DBContext in Entity Framework? 【发布时间】:2021-08-06 07:17:34 【问题描述】:

我有一张这样的桌子:

ID Name
1 John
2 John
3 John
4 Stephen
5 Peter
6 Ray
7 Tim

然后我有一个包含DbContext 方法的存储库类:

public class Repository<T> : IRepository<T> where T : class

        private readonly DbFactory _dbFactory;

        public Repository(DbFactory dbFactor)
        
            _dbFactory = dbFactor;
        

        public void Add(T entity)
        
            _dbFactory.DbContext.Add(entity);
        

        public Task<T> GetByIdAsync(long id)
        
            return _dbFactory
                .DbContext
                .FindAsync<T>(id)
                .AsTask();
        

现在我想在这个类中包含另一个方法来获取所有具有相似名称的 ID。如果我传入某个 ID,它应该会获取所有其他具有相同名称的 ID。

例如,如果我传入ID = 1,它应该获取这些行:

ID
2
3

我可以使用实体框架中DbContext 中的哪些现有方法来实现这一点?

【问题讨论】:

你会如何编写 SQL 来做到这一点@Nisha? 我想在 DBContext 方法中使用 linq,如下所示:var query = from t1 in items from t2 in items where t1.Name== t2.Name && t1.Id == UserInputData.Id跨度> 通过具有相似的名称您真正命名:所有具有相同名称的行 - 对吗?英语中的“相似”并不真正意味着“相同”——你在这方面不是很清楚.... 【参考方案1】:

从最简单、最容易理解的事情开始:两个查询...

var name = context.People
    .Where(x => x.Id == id)
    .Select(x => x.Name)
    .Single();
var otherIds = context.People
    .Where(x => x.Name == name && x.Id != id)
    .Select(x => x.Id)
    .ToList();

要自加入,就有点丑了:

var query = context.People
    .Where(x => x.Id == id)
    .Join(context.People,
        p1 => p1.Name,
        p2 => p2.Name,
        (p1, p2) => new  P1Id = p1.Id, P2Id = p2.Id )
    .Where(x => x.P1Id != x.P2Id)
    .Select(x => x.P2Id)
    .ToList();

【讨论】:

【参考方案2】:

你的输入参数总是id吗?或者您可以将其更改为字符串名称?

public async Task<T> GetIdBySimilarNameAsync(string name)

        return await _dbFactory
            .DbContext
            .Where<T>(x => x.name  == name)
            .Select(p => new p.Id).ToListAsync();

【讨论】:

谢谢..输入参数应该是ID。不过我也会试试这个方法

以上是关于如何使用实体框架中的 DBContext 获取在另一列中具有重复数据的所有 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何刷新实体框架核心 DBContext?

如何从 DBContext(实体框架核心)中的 App.config(不是 .net 核心应用程序)读取值

使用实体框架6的mvc4中的单个或多个DbContext文件

实体框架:如何防止 dbcontext 被多个线程访问?

关于EF实体框架中的 dbContext

通过实体框架更新时如何绕过唯一键约束(使用 dbcontext.SaveChanges())