11-11. 在LINQ中調用資料庫函數問題相要在一個LINQ 查詢中調用資料庫函數.解決方案假設有一個任命(Appointment )實體模型,如Figure 11-11.所示, 我們想要查詢某周給定的一天里的所有appointment.Figure 11-11. An Appointment e...
11-11. 在LINQ中調用資料庫函數
問題
相要在一個LINQ 查詢中調用資料庫函數.
解決方案
假設有一個任命(Appointment )實體模型,如Figure 11-11.所示, 我們想要查詢某周給定的一天里的所有appointment.
Figure 11-11. An Appointment entity with the start and end times for appointments
如果我們想要找出所有周四的appointment, 我們不能在where子句里,使用運行時枚舉DayOfWeek.Thursday與StartsAt屬性比較,因為這樣是不能翻譯成資料庫語句.
我們需要像下列的Listing 11-18這樣操作:
Listing 11-18. Using a Database Function in a LINQ Query
class Program
{
static void Main(string[] args)
{
RunExample();
}
static void RunExample()
{
using (var context = new EFRecipesEntities())
{
var app1 = new Appointment
{
StartsAt = DateTime.Parse("7/23/2013 14:00"),
GoesTo = DateTime.Parse("7/23/2013 15:00")
};
var app2 = new Appointment
{
StartsAt = DateTime.Parse("7/24/2013 9:00"),
GoesTo = DateTime.Parse("7/24/2013 11:00")
};
var app3 = new Appointment
{
StartsAt = DateTime.Parse("7/24/2013 13:00"),
GoesTo = DateTime.Parse("7/23/2013 15:00")
};
context.Appointments.Add(app1);
context.Appointments.Add(app2);
context.Appointments.Add(app3);
context.SaveChanges();
}
using (var context = new EFRecipesEntities())
{
var apps = from a in context.Appointments
where SqlFunctions.DatePart("WEEKDAY", a.StartsAt) == 4
select a;
Console.WriteLine("Appointments for Thursday");
Console.WriteLine("=========================");
foreach (var appointment in apps)
{
Console.WriteLine("Appointment from {0} to {1}",
appointment.StartsAt.ToShortTimeString(),
appointment.GoesTo.ToShortTimeString());
}
}
}
}
上述Listing 11-18代碼輸出結果如下:
Appointments for Thursday
=========================
Appointment from 9:00 AM to 11:00 AM
Appointment from 1:00 PM to 3:00 PM
它是如何工作的?
資料庫函數可用於eSQL 和LINQ 查詢中. 這些函數通過
SqlFunctions 類里的方法發佈出來.由於這些函數運行在資料庫端, 所以它的表現方式可能與你在.net端想的表現方式會有所不同,例如周四,在.NET里 DayOfWeek.Thursday 的值是4.而在資料庫, 它是第5天,所以它的值是5.
與資料庫函數在eSQL中使用一樣,不是所有的資料庫函數都被LINQ查詢支持,可以從微軟的文檔中查看所有支持的函數列表.