2010-11-18 5 views
0

간단히 말해서 SqlMethods.DateDiffDay과 같은 메서드를 만드는 이유는 무엇입니까?"SqlMethods"메서드는 어떻게 작동합니까?

는 메소드 서명은 다음과 같습니다

public static int DateDiffDay(DateTime startDate, DateTime endDate); 

그래서 내부에 무슨 (또는 외부 마법을 통해) 그 작품 수 :

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

을 ... 왜 그것을 숨기는 것 내 자신의 방법 내에서 실패하게 만든다. (어떤 이유로 든이 일을하려고하는 것이 아니라 단지 그것을 더 잘 이해하려고 노력하는 것이 아니다.)

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); 
} 

답변

6

매우 간단합니다 : 구문 분석 엔진은 표현식 트리를 볼 때 하드 코딩되어 해당 메서드를 찾아 TSQL의 특정 방식으로 해석합니다. 실제로 은 이 실패한 이유 인을 호출합니다. 즉, MyOwnDateDiffDay으로 점프하도록 프로그래밍되지 않았습니다.

당신은 일반적으로 L2S에 대한 UDF를 캡슐화하는 [Function(...)] 코드를 사용하여 자신의 코드에 작은 정도이 작업을 수행 할 수 있습니다 - 예를 들어, 여기에 NEWID 붙박이 SQL-서버 기능을 포장의 건방진 방법을 :

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

그래, 나는 UDF 솔루션을 대체하는 더 깨끗한 방법에 대한 단서를 찾고 있었다. 나는 이것이 대답이 아니길 바라지 만 동시에 기대되는 종류의 것이기를 바랐다. 응답 주셔서 감사합니다! – Ocelot20

2

LINQ 식을 사용하면 group x by y은 실제로 소스에서 (이름으로) GroupBy을 호출합니다.

일부 열거 클래스 (예 : 소스 IEnumerable를 구현하는 경우,이 일부 키 값 소스 유형으로부터 임의의 함수를 받아들이는 일반적인 호출 방법 및 것 LINQ to SQL 클래스)는 IEnumerable<T>을 구현할뿐만 아니라 IQueryable<T>을 구현합니다. 이것은 다음의 방법도 사용할 수 있음을 의미한다 : 여기

는, 상기 방법은 분석 될 수 expression tree를 수신한다. LINQ to SQL의 경우 SqlMethods.*의 존재가 감지되고 함수를 실행하는 대신 해당 SQL Server 작업으로 변환되어 SQL Server에서 수행됩니다 (사용자의 경우 DATEDIFF).