在 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.compare
与compareoptions
一起使用,如ignorecase
和ignoresymbols
以及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 中使控制器作用域或单例而不是瞬态?