【发布时间】:2018-10-09 18:57:50
【问题描述】:
我的问题可能有点幼稚,但我以前从未使用过数据库。我是一名 .NET 工程师,我使用 Dapper 访问 SQL Server 数据库。
情况如下:我有一个非规范化表,用于持久化几种类型的实体。每个都有一个复合键(type、id、owner_id)并且键的每一行都是字符串类型(但这并不重要)。而且,假设我正在向数据库写入不同用户的许多兴趣(批量发布)。为了不重复,我需要进行查询并确定哪些已经存在于数据库中。
所以,我的 InterestService 类中有这段代码:
private IEnumerable<Interest> GetAlreadyExistingInterestsFor(IEnumerable<Interest> interestsForCreating) =>
_interestRepository.GetInterests(interestsForCreating.Select(interest => interest.Id).ToList(),
interestsForCreating.Select(interest => interest.UserId).ToList());
之后我有一些逻辑等等。这不重要。
InterestRepository 方法 GetInterests 看起来像这样:
public GetInterests(IList<string> interestIds, IList<string> userIds)
{
var query = @"SELECT type, id, owner_id
FROM entities
WHERE type = 'interest'
AND id IN @InterestIds
AND owner_id IN @UserIds";
return _dbContext.ExecuteQuery(query, new { InterestIds = interestIds, UserIds = userIds });
}
代码可能有错误,因为现在我无法访问工作环境,但我认为这个想法很清楚。因此,问题是这是否是进行查询的最佳方法。如果有更好的,那是什么。
【问题讨论】:
-
你有能力使用存储过程吗?
-
不,那样不行。您应该考虑使用表值参数。然后你可以对你的两个表参数使用内连接。
-
如果您正在寻找建议,我会研究实体框架。简化编码的存储库部分。由于您已经有一个数据库,您将使用 db-first 方法。 docs.microsoft.com/en-us/ef/ef6/modeling/designer/workflows/…
-
@DavidGreilach 没有。我正在考虑存储过程和触发器,但不想使用它们。
-
@SeanLange 我没明白。你能更广泛地描述你的观点吗?
标签: c# sql .net sql-server dapper