在 EF 中使用自定義的 SQL Function

  • 1189
  • 0
  • C#
  • 2016-10-26

除了透過 EF 直接以 SQL 呼叫 Function 的方式外
也可以直接透過 LINQ 讓 EF 自動呼叫自定義的 SQL Function

註:
EF 6 版,要用 DbFunction
EF 5 版,要用 EdmFunction

 

參考文章:MSDN

1.建立相關的 Table:DT

2.建立 SQL Function
功用是把 dt 欄位格式轉成 yyyyMMdd 的格式
function name:ConvertToYYYYMMDD

3.在專案內建立 ADO.NET 實體資料模型
將 Table、Function 都加進來

4.擴充 DbContext 類別
新增類別,名稱不要與 EF 產生的重複,這邊使用 EFFunction.cs
內容如下:

using System;
using System.Data.Entity;

namespace ef_function.Models
{
    public partial class TestEntities
    {
        [DbFunction("TestModel.Store", "ConvertToYYYYMMDD")]
        public string ConvertToYYYYMMDD(string date)
        {
            throw new NotSupportedException("Direct calls are not supported.");
        }
    }
}

TestEntities 是 EF 自動建立的類別
TestModel.Store 是 參考 TestEntities 內的 Schema Namespace

5.執行程式
使用方式必須搭配 LINQ
如果直接存取的話,就會出現上面所定義的 Exception

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TestEntities db = new TestEntities();
            List<string> result = db.DT.Select(
                 d => db.ConvertToYYYYMMDD(d.date)).ToList();

            foreach (var item in result)
            {
                Console.WriteLine(item);
            }           
            Console.ReadLine();
        }
    }
}


執行結果如下: