什么使"SqlMethods"方法有效?

Oce*_*t20 0 .net c# linq linq-to-sql

简单地说,是什么让方法像SqlMethods.DateDiffDay工作一样?

方法签名如下所示:

public static int DateDiffDay(DateTime startDate, DateTime endDate);
Run Code Online (Sandbox Code Playgroud)

所以内部(或通过一些魔法外部)发生的事情使得这项工作:

var query = from a in db.TableA
            group a by SqlMethods.DateDiffDay(a.Start, a.End) into g
            select g.Key;
Run Code Online (Sandbox Code Playgroud)

...为什么将它隐藏在我自己的方法中会使它失败(不是我试图以任何理由这样做,只是试图更好地理解它):

var query = from a in db.TableA
            group a by MyOwnDateDiffDay(DateTime startDate, DateTime endDate) into g
            select g.Key;

public static int MyOwnDateDiffDay(DateTime startDate, DateTime endDate)
{
    return SqlMethods.DateDiffDay(startDate, endDate);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

非常简单:在查看表达式树时,解析引擎是硬编码的,用于发现这些方法并在TSQL中以特定方式解释它们.它从来没有真正调用过这个方法 - 这就是为什么你的MyOwnDateDiffDay失败 - 它没有编程来发现MyOwnDateDiffDay.

您可以通过使用通常为L2S封装UDF 的代码在您自己的代码中做一小部分[Function(...)] - 例如,这是一种结束NEWID内置SQL-Server功能的厚颜无耻的方法:

partial class MyDataContext
{
     [Function(Name="NEWID", IsComposable=true)] 
     public Guid Random() 
     { // to prove not used by our C# code... 
         throw new NotImplementedException(); 
     }
}
Run Code Online (Sandbox Code Playgroud)