如何使用实体框架中的 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(实体框架核心)中的 App.config(不是 .net 核心应用程序)读取值