2012-05-16 66 views
2

我希望我能寫LINQ到實體查詢調用其他功能:SQL級別函數可用於LINQ to Entity查詢嗎?

from c in context.Widgets 
where MyFunc(c.name) 
select c 

會導致一個錯誤,因爲很明顯的表達,不能轉化爲TSQL調用MYFUNC。

嗯,我在想,除非MyFunc是一個用戶定義函數或(我認爲更好)SQL/CLR函數。

所以這是可能的,而且它是推薦?

如果這是不可能的,我希望這個功能有效,並有可能將被ADO.NET的未來解決?

回答

3

您應該創建一個用戶 - 定義的功能MyFunc在數據庫中,並將其手動導入到您的上下文中(edmx,因此數據庫優先),無論是在XML中還是作爲上下文類中的部分類中的存根。該過程描述如下:

How to use a custom database function(請注意,「StorageNamespace」是你在XML文件中找到<edmx:StorageModels><Schema Namespace=...下的命名空間

MSDN也有類似的描述

+0

感謝,這是一個很大的幫助。 ! –

0

EF在將.net類與數據庫結構進行同步時非常有用,最適合數據庫笨拙並且所有邏輯都位於類中的地方。

但是你可以映射到函數和存儲過程 - 這有點技術性的解釋(很容易做) - 讓我找到一些鏈接給你。

這裏有一個糟糕的方式做到這一點:

// Query that calls the OrderTotal function to recalculate the order total. 
string queryString = @"USING Microsoft.Samples.Entity; 
    FUNCTION OrderTotal(o SalesOrderHeader) AS 
    (o.SubTotal + o.TaxAmt + o.Freight) 

    SELECT [order].TotalDue AS currentTotal, OrderTotal([order]) AS calculated 
    FROM AdventureWorksEntities.SalesOrderHeaders AS [order] 
    WHERE [order].Contact.ContactID = @customer"; 

int customerId = 364; 


using (AdventureWorksEntities context = 
    new AdventureWorksEntities()) 
{ 
    ObjectQuery<DbDataRecord> query = new ObjectQuery<DbDataRecord>(queryString, context); 
    query.Parameters.Add(new ObjectParameter("customer",customerId)); 

    foreach (DbDataRecord rec in query) 
    { 
     Console.WriteLine("Order Total: Current - {0}, Calculated - {1}.", 
      rec[0], rec[1]); 
    } 
} 

http://msdn.microsoft.com/en-us/library/dd490951.aspx

的這裏是如何做正確:

http://scipbe.wordpress.com/2010/08/30/stored-procedures-udfs-in-the-entity-framework-part-1/