繁体   English   中英

LINQ to SQL 查询中的自定义方法

[英]Custom Method in LINQ to SQL query

是否可以在查询中使用自定义方法,例如:

var result = from u in context.MyTable where MyMethod(u) == 10 select u;

正如 Pranay 解释的那样,您不能将自定义 (C#) 方法作为 LINQ to SQL 查询的一部分,因为 LINQ to SQL 将无法查看该方法的表达式树,因此它无法将其转换为 SQL。

您拥有的一种选择是用 SQL 编写函数并将其作为 SQL 函数存储在 SQL Server 上(可能,您也可以使用 SQL CLR,但我还没有尝试过)。 然后,您可以将该函数添加到您的DataContext类型,LINQ to SQL 会将其转换为对 SQL 服务器上的函数的调用。 就像是:

var result = from u in context.MyTable 
             where context.MyMethod(u) == 10 select u; 

当然,问题是您需要在 SQL 中编写函数(我认为 SQL CLR 也可以工作 - 但不确定性能和其他可能的并发症)

我还写了一篇文章(前段时间),展示了在将“方法”编写为表达式树方式(作为Expression<Func<...>>类型的值)时如何执行此操作,这是可能的,因为在这种情况下,代码被编译为表达式树。 但是,有一些后处理必须完成,您仍然可以只编写一个可以轻松内联到 LINQ 查询中的表达式。

查看这篇完整的文章: linq 是什么,什么是不可能的

以下是不可能的

// function used in filter
static bool MyFunc(Nwind.Product p)
{
  return p.ProductName.StartsWith("B");
}
// query that uses MyFunc
var q = 
  from p in db.Products
  where MyPriceFunc(p.UnitPrice) > 30m
  select p

它编译时没有错误,但是当你执行它时,LINQ to SQL 抛出一个异常说:“静态方法 System.Boolean MyTest(LINQTest.Nwind.Product) 不支持到 SQL 的转换。”

当您尝试从 q 获取结果(例如使用 foreach 语句)时,实际上会抛出异常,因为 LINQ to SQL 仅在需要结果并且必须执行查询时才尝试将表达式树转换为 T-SQL。

要修复该示例,您可以简单地将检查产品名称是否以“B”开头的代码复制到查询的 where 子句中,它会正常工作。

是的,但是如果您使用的是 Linq-to-Sql - 您的方法必须有特殊的代码来处理 SQL 转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM