Entity Framework 5中應用表值函數進行Linq查詢


Entity Framework 5引入了表值函數(Table-Valued Functions TVFs)。表值函數的返回類型是一個Table類型,可用在SQL查詢語句中。最簡單的表值函數,讀取客戶表的記錄,參考如下代碼:

CREATE FUNCTION  GetCustomers
return table
AS

return (  SELECT  *   FROM Customer) ;
 

此外,表值函數還可以指定要返回的表的列名和函數參數,請參考下面的代碼例子:

 
CREATE FUNCTION  GetCustomer(@customerNo nvarchar(50))

returns table 

AS

RETURN (  select * from  customer where customerNo=@customerNo );

Entity Framework 5的Target是.NET 4.5,所以只有選擇Visual Studio 2012才可以編譯代碼。

打開SQL Server Management Studio,運行下面的SQL表值函數:

CREATE FUNCTION [dbo].[GetStudentGradesForCourse]
 (@CourseID INT)
 RETURNS TABLE
 RETURN
    SELECT [EnrollmentID],
           [CourseID],
           [StudentID],
           [Grade]
    FROM   [dbo].[StudentGrade]
    WHERE  CourseID = @CourseID

啟動Visual Studio 2012,增加一個新項目,添加ADO.NET Entity Data Model。在選擇模型內容對話框中,選擇從數據庫中產生,點擊下一步,創建一個新的數據庫連接。

在選擇數據庫對象窗口中,選擇存儲過程和函數節點,選取它下面的子節點GetStudentGradesForCourse函數,點擊完成。

默認的,存儲過程和函數的返回值會自動生成一個新復合類型,但是,我們需要的是讓它返回一個StudentGrade對象,如上面的函數腳本所表達的。為達到此目的,在模型瀏覽器窗口中,選擇導入的函數,雙擊GetStudentGradesForCourse函數,在編輯導入的函數對話框中,選擇實體,然后選擇StudentGrade類型。

在.NET代碼中,請參考下面的Linq查詢,它會調用表值函數,然后投影到一個新的匿名類型中,代碼如下所示

using (var context = new SchoolEntities())
{
    var CourseID = 4022;
    var Grade = 3.5M;
    
    // Return all the best students in the Microeconomics class.
    var students = from s in context.GetStudentGradesForCourse(CourseID)
                            where s.Grade >= Grade
                            select new
                            {
                                s.Person,
                                s.Course.Title
                            };
 
    foreach (var result in students)
    {
        Console.WriteLine(
            "Couse: {0}, Student: {1} {2}",
            result.Title, 
            result.Person.FirstName, 
            result.Person.LastName);
    }
}

Entity Framework中,需要手動拖動object(table,function,stored procedure)到實體設計器中,這樣會有些不方便。如果想一次性把所選擇的object都添加的實體設計器中,可以參考如下的方法。

應用工具 Huagati DBML/EDMX,它可以批量的添加數據庫中的表,視圖,或是存儲過程和函數。

image

官方的通知里面提到,此產品在今年底(2013.12.31)將停止開發(discontinue)。微軟的構建的生態系統既壟斷了框架開發的內容,還占據了開發工具領域,第三方的小工具生存的機率是很不容易。

除了微軟自己的實體設計器,還有些第三方的實體設計工具,在這里做一個簡單介紹。

Devart 的 Entity Designer,地址是 http://www.devart.com/entitydeveloper/,主要特性是支持模型優先和數據庫優先的二種開發模式,而且支持框架NHibernate,ADO.NET Entity Framework,LinqConnect,Linq to SQL。

Solution Design的LLBL Gen Pro,地址是http://www.llblgen.com 

3.x的版本才引入的多框架支持,對其它的框架支持可能僅僅是個賣點,它自身框架的(LLBL Gen Pro Framework)已經非常成熟穩定。

LLBL Gen是一個支持多框架的實體設計工具,如NHibernate,Entity Framework,LLBL Gen Pro Framework。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM