Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从谓词中调用用户定义的C#方法到实体框架查询_C#_.net_Entity Framework_Entity Framework 6_Ado.net - Fatal编程技术网

从谓词中调用用户定义的C#方法到实体框架查询

从谓词中调用用户定义的C#方法到实体框架查询,c#,.net,entity-framework,entity-framework-6,ado.net,C#,.net,Entity Framework,Entity Framework 6,Ado.net,我正在使用实体框架版本6.2.0,目标是.NET框架版本4.6.1 我希望我的用户定义函数是实体框架谓词的一部分,如下所示: var someValue = ...; var matchingRecord = context.Records.SingleOrDefaultAsync( rec => My.User.Defined.Function(rec.Property, someValue) == true); 但当然,实体框架无法将其转

我正在使用实体框架版本6.2.0,目标是.NET框架版本4.6.1

我希望我的用户定义函数是实体框架谓词的一部分,如下所示:

var someValue = ...;

var matchingRecord = context.Records.SingleOrDefaultAsync(
                     rec => My.User.Defined.Function(rec.Property,  someValue) == true);
但当然,实体框架无法将其转换为SQL查询,因为T-SQL中没有与之等价的
My.User.Defined.Function

除此之外,我还能做什么:

  • 使用Entity Framework支持的那种神秘的中间语言,它看起来有点像SQL,但实际上不是

  • 使用
    DbContext.ExecuteCommand()

  • 使用ADO.NET的
    SqlCommand.ExecuteReader()


  • 是否还有其他选项?

    检查此选项是否适用于您的场景-?@user1672994,其中一个选项映射到SQL中的用户定义函数。我的问题是:我想调用一个在SQL中没有表示形式的函数。我认为除了在没有函数的情况下执行查询,然后在我自己的程序的进程地址空间中对其进行过滤之外,没有其他方法。我认为您无法做到这一点,在linq to sql中,它无法将您的方法转换为sql查询,这就是它无法工作的原因。它使用延迟执行来延迟执行,直到您通过调用toList()或其他方法完成为止。但是用户定义的函数无法转换为sql,因此会中断延迟执行。据我所知,唯一的其他选择是完成查询并独立处理结果。实际上,sql查询是预编译的,然后在运行时执行。您的用户预定义函数无法做到这一点,因为它仅在运行时可用,而在构建时不可用。正如Glenn所说,您必须执行查询,调用ToList退出IQueryable,然后应用过滤器。不幸的是,这样做可能会有一些性能问题,因为您要加载一个海量数据集,然后对其进行过滤。请检查这是否适用于您的场景-?@user1672994,其中一个映射到SQL中的用户定义函数。我的问题是:我想调用一个在SQL中没有表示形式的函数。我认为除了在没有函数的情况下执行查询,然后在我自己的程序的进程地址空间中对其进行过滤之外,没有其他方法。我认为您无法做到这一点,在linq to sql中,它无法将您的方法转换为sql查询,这就是它无法工作的原因。它使用延迟执行来延迟执行,直到您通过调用toList()或其他方法完成为止。但是用户定义的函数无法转换为sql,因此会中断延迟执行。据我所知,唯一的其他选择是完成查询并独立处理结果。实际上,sql查询是预编译的,然后在运行时执行。您的用户预定义函数无法做到这一点,因为它仅在运行时可用,而在构建时不可用。正如Glenn所说,您必须执行查询,调用ToList退出IQueryable,然后应用过滤器。不幸的是,这样做可能会有一些性能问题,因为您将加载一个庞大的数据集,然后对其进行过滤。