在 ASP.NET Core Web API 中使用 Linq 避免实体重复

Posted

技术标签:

【中文标题】在 ASP.NET Core Web API 中使用 Linq 避免实体重复【英文标题】:Avoid entity duplication with Linq in ASP.NET Core Web API 【发布时间】:2022-01-04 01:04:53 【问题描述】:

我想知道在 ASP.NET Core Web API 项目中避免实体重复的最佳方法。

假设您有一个带有名称和制造商的产品,并且您想确保名称是否重复。想象一下,一个带有名字的新产品来自客户端(dto),我们需要查看这个名字(实体)是否已经存在于数据库中(使用 EF)。

    您需要修剪实体名称和 dto 名称的名称 (name.trim())

    您需要删除中间的所有空格 (string.replace(" ", string.empty())

    您需要将所有内容更改为小写 (string.lower())

    最后你需要比较这两个

是否有任何最佳实践可以在不编写所有代码的情况下做到这一点?我尝试将string.comparecompareoptions 一起使用,如ignorecaseignoresymbols 以及string.equal()ignorecase 选项,但EF 给我一个警报,它无法翻译代码。

br

【问题讨论】:

基本上,您的比较方案没有内置方法。您需要为您的需求编写业务逻辑,例如为字符串编写扩展方法。 @TinyWang:编写扩展方法是一个很好的方案,但我总是收到来自 EF 的错误,说它无法翻译。 分享你的代码 sn-p 和错误信息? 【参考方案1】:

我对你的方法有一个建议。

    在向该表中插入新记录时,引入另一列(这可以是主键和其他键)并使用修剪和小写保存名称。

示例: 原名:Amir Masoud Babaei --> 新列值:amirmasoudbabaei

    当您插入新记录时,请进行修剪和小写更改并将其保存到数据库中。既然是主键,应该会报错。

    因此,使用这种方法,您无需遍历所有名称并验证该名称是否已存在。

【讨论】:

感谢 Avi,这个场景真的很酷,但我们确实有很多其他的业务逻辑也值得关注。像序列号也需要唯一或其他逻辑。所以,我认为我为每个业务逻辑写一个专栏不是一个好主意,对吧? 绝对正确,我们不需要为您要执行的每个验证创建单独的列。因此,在这种情况下,您可以定义一个名为 IValidation 的接口,它只有一个名为 Validate() 的方法。因此,您可以在您的具体类中实现这一点,并为您想要的每个属性执行验证。这样更干净漂亮。

以上是关于在 ASP.NET Core Web API 中使用 Linq 避免实体重复的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web Api 自动帮助页面

如何在 ASP.NET Core 中使控制器作用域或单例而不是瞬态?

ASP.NET Core Web API

ASP.NET Core Web API 在 API GET 请求中检索空白记录

Asp.Net Core 1.1 消费web api

使用 ASP.NET Core MVC 创建 Web API