如何在 LINQ 查询中使用自定义方法

Posted

技术标签:

【中文标题】如何在 LINQ 查询中使用自定义方法【英文标题】:How to use custom Methods in LINQ Query 【发布时间】:2021-06-27 05:58:01 【问题描述】:

我有以下问题:我目前正在开发 ASP .net 核心实体框架后端,并且遇到需要在 LINQ 查询中使用自定义方法并在执行此操作时出现错误的问题。一世 研究并发现可以编写自定义函数,将其翻译为sql,但我认为这样做的范围不大。 (例如:SQL 将无法使用库和哈希字符串)。

我听说的另一种方法是将我的数据库转换为 Enumberale,然后在其上应用我的自定义方法,这种方法有效,但性能不佳,因为我将整个数据库保存在我的内存中,这变得非常有大量数据时速度很慢。所以我的问题是,是否有在 LINQ 查询中执行自定义方法的高性能解决方案?

我的详细问题是,我已经将我的加盐密码保存在我的数据库中,当有人想要登录他的帐户时,我必须将数据库中的密码与盐 + 用户密码输入进行比较,这必须在我的 where 子句中进行哈希处理。如果我不使用盐,它会起作用,因为那时我只需要对用户输入进行哈希处理,这不是数据库的列。

【问题讨论】:

您应该从数据库中获取盐和哈希密码,然后在代码中对用户输入进行哈希处理并与现有哈希进行比较。无需向数据库发送复杂的代码。也可能是散列故意不具有防止暴力攻击的性能。 在数据库中运行存储过程进行检查。您使用的是什么类型的数据库? madoxdev 的回答涵盖了它:为什么要在 Linq 查询中计算类似哈希的东西?在存储像密码这样的哈希值时,您将 Salt 和哈希值保存到数据库记录中。您确实存储未加密的值,然后尝试在查询中散列等式的两端或类似的东西。 请看我的回答。 @jdweng 我使用 mysql 作为数据库。 【参考方案1】:

你应该做的是 - 在后端计算哈希和盐,并在你的 WHERE 语句中使用计算的哈希。在这种情况下,您不需要从 SQL 中调用您的方法,也不需要将整个数据库(或表)拉入内存来计算哈希。

由于我不知道您的代码,因此伪代码方法是:

    var user = service.GetUserByEmail(email);
if (user == null) 
//Invalid User

    var hash = ComputeHash(user.Salt, inputPwd);
    
 if(user.PasswordHash == hash) 
//User is logged in
 else 
//Invalid Password or email

【讨论】:

我知道要做什么,但是当我尝试散列当前的 salt + 用户在 where 子句中输入密码时出现错误,因为 LINQ 会在 SQL 中翻译它。 var 结果 = _context.Users。 .Where(e => (e.UserMail.ToUpper().Equals(data.Mail.ToUpper()) && e.UserPasswort.Equals((CreateHash(e.UserSalt + data.Password))))) .FirstOrDefault( ); 请看我的代码,我从数据库中获取整个用户,然后不在上下文中进行哈希计算(只为该用户传递数据),然后我比较我计算的是否是等于保存到数据库中的内容。当您尝试在 Cotext 上执行所有这些操作时,这是行不通的要求 好的,谢谢你的解决方案,我的方法不是最好的。

以上是关于如何在 LINQ 查询中使用自定义方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 在 OrderBy 中自定义排序逻辑

ZF2 Doctrine - 使用查询构建器如何指向存储库中的自定义方法

access 查询条件 能否用自定义的函数

如何在 build.gradle 中定义和调用自定义方法

Django:对查询集值使用自定义方法()

Django:对查询集值使用自定义方法()