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

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

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>类型的值)编写时,如何做到这一点,这是可能的,因为在这种情况下,代码被编译为表达式树。 但是,有一些必须完成的后处理,您仍然可以只编写一个可以在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抛出一个exception说:“静态方法System.Boolean MyTest(LINQTest.Nwind.Product)没有支持的SQL转换。”

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

要修复该示例,您只需将检查产品名称以“B”开头的代码复制到查询的where子句,它就可以正常工作。

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