【问题标题】:Unexpected Error : LINQ to Entities does not recognize the method 'System.String DecryptValue(Byte[], System.String)' method意外错误:LINQ to Entities 无法识别方法“System.String DecryptValue(Byte[], System.String)”方法
【发布时间】:2016-09-07 05:06:33
【问题描述】:

我的 udf:

[EdmFunction("Model.Store", "Decrypt")]
public static string Decrypt(byte[] Value, string Passphrase)
{
    throw new NotSupportedException("Direct calls are not supported.");
}

我的 LINQ 调用:

var passphrase = "phrase123";
var decryptedValue = (from p in unitOfWork.context.Values
                      where p.ValueID== valueId
                      select Decrypt(p.value, passphrase)).FirstOrDefault();

这是实际的错误信息:

意外错误:LINQ to Entities 无法识别方法“System.String Decrypt(Byte[], System.String)”方法,并且该方法无法转换为存储表达式。

SQL 函数

CREATE FUNCTION DB.Decrypt
(
    @Value VARBINARY(200),
    @Passphrase varchar(1000)
)
RETURNS VARCHAR(1000)

如何解决此问题以解密该值?谢谢

更新: 我更改了我的 edmfunction 以尝试将 varbinary 处理为:

public static string Decrypt(SqlBinary Value, string Passphrase)

并收到一条新的错误消息:

LINQ to Entities 无法识别方法 'System.String Decrypt(System.Data.SqlTypes.SqlBinary, System.String)' 方法,并且该方法无法转换为存储表达式。

这仍然让我相信 C# 中的 varbinary 等效项有问题

【问题讨论】:

  • 您正在尝试在不会转换为 sql 的表达式中使用代码。只需先返回值,再解密即可。
  • @StephenBrickner 解密功能在 SQL server 上实现;它只是没有与 c# 版本“连接”。
  • 您能否通过 Management Studio 中的等效 SELECT 语句正确运行解密功能?你能发布一个成功执行的查询吗?
  • 您是否忘记将函数导入您的数据库模型?
  • 函数在db模型中。

标签: c# sql entity-framework linq


【解决方案1】:

答案很简单。由于 resharper 的建议,我的 EdmFunction 使用了错误的参考......要使用的正确类是

using System.Data.Entity.Core.Objects.DataClasses;

很抱歉给大家带来了麻烦,感谢大家的努力!

【讨论】:

  • 很高兴你把它整理好了;)
【解决方案2】:

Linq to Entities 正在尝试扩展到类似的东西;

select Decrypt(p.Value, @passphrase) 
from values p
where p.valueid = @valueId

您的代码的 Decrypt 函数与服务器上的匹配函数似乎无法匹配。从我见过的其他示例来看,它看起来不错,所以我怀疑这是一个小的“胶水”问题......

我想知道其中是否有任何有用的线索;

  • C# Decrypt() 将 byte[] 作为第一个参数——这是 p.value 的实际数据类型吗?例如,如果它是一个字符串,您可能需要微调函数声明中的类型。
  • 您确定在当前连接的数据库上获得了该功能吗?也许错过了某种更新?

【讨论】:

  • 嗨史蒂夫,p.value 的实际数据类型是 varbinary。我做了一些研究,发现 c#equivalent 是 byte[]。不过我肯定有这个功能,而且它没有改变。
  • 能否在 SSMS 中将其作为普通 SQL 语句执行?如果是这样,那么它将是 EDMX 中的东西;我将基本错误理解为“Linq to Entities 不知道 Decrypt(byte[], string) 所以你使用它是非法的。”必须是一些小的东西,比如架构名称、参数名称拼写错误等。 uow.context.Values 是普通 IDbSet 吗?
  • 是的,它是包含 valueid 和 p.value 的表
  • 我很难看出你的代码有什么问题,真的。您能否在原始问题上再发布一些代码?也许是 CREATE FUNCTION 语句的“外部”部分——不是主体,而是包含名称、参数名称、参数类型等的部分。此外,“Model.Store”是正确的命名空间吗?如果命名空间关闭,它可能会表现出这种行为?
  • 在帖子中添加了功能外部部件。此外,我将我在项目中实际使用的内容重命名为 Model.Store。但我只是验证它是正确的。我在 xml 中编辑了 EDMX 文件以确保它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 2012-05-03
  • 1970-01-01
  • 2012-04-22
相关资源
最近更新 更多