2010-11-18 13 views
0

Basitçe söylemek gerekirse, SqlMethods.DateDiffDay gibi bir yöntem nasıl çalışır?"SqlMethods" Yöntemleri Ne İşe Yarayor?

yöntem imzası şuna benzer:

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

Peki içinde neler (veya dışında biraz büyü yoluyla) o bu işi yapar:

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

... ve neden saklıyorsun ediyorum Kendi yöntemim içinde başarısız olun (herhangi bir sebepten dolayı bunu yapmaya çalışıyorum, sadece daha iyi anlamaya çalışıyorum):

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

cevap

6

Çok basit: ayrıştırma motoru, ifade ağacına bakıldığında, bu yöntemleri tespit etmek ve bunları TSQL'de belirli bir şekilde yorumlamak için sabit kodlanmıştır. Aslında hiçbir zaman yöntemini çağırır - bu nedenle MyOwnDateDiffDay başarısız olur - MyOwnDateDiffDay noktasında programlanmış değildir.

Normalde L2S için UDF kapsüller [Function(...)] kodunu kullanarak kendi kodunda bir küçük dereceye kadar yapabilirsiniz - örneğin, burada NEWID dahili SQL Sunucu işlevini tamamlamasından bir arsız yoludur:

group x by y aslında kaynağını GroupBy (adını) çağırır LINQ ifadeyi kullanarak
partial class MyDataContext 
{ 
    [Function(Name="NEWID", IsComposable=true)] 
    public Guid Random() 
    { // to prove not used by our C# code... 
     throw new NotImplementedException(); 
    } 
} 
+0

Evet, UDF çözümünü değiştirmenin daha temiz bir yolu için bazı ipuçları arıyordum. Bunun cevabın olmayacağını umuyorum, ama aynı zamanda olması bekleniyordu. Cevabınız için teşekkürler! – Ocelot20

2

.

Bazı numaralandırılabilir sınıfları (örneğin, kaynak IEnumerable uygular, bu, bazı anahtar değeri, kaynak türü herhangi bir fonksiyon kabul eden bir yaygın olarak adlandırılan bir yöntem ve olur LINQ to SQL sınıfları) sadece IEnumerable<T>'u değil, aynı zamanda IQueryable<T>'u da uygular. Bu, aşağıdaki yöntem de kullanılabilir olduğu anlamına gelir: Burada

, yöntem çözümlenebilir bir expression tree alır. LINQ to SQL durumunda, SqlMethods.*'un varlığı algılanır ve işlevi yürütmek yerine, ilgili SQL Server işlemine çevrilir ve SQL Server'da gerçekleştirilir (sizin durumunuzda, DATEDIFF).