2014-01-10 34 views
1

我試圖確定下面是否可能作爲第一步。是否可以構建基於EF元數據的動態查詢?

本質上,我想創建一個機制,從字段名稱(字符串)和值,我可以動態地在實體的元數據中找到字段名稱,並根據該信息創建一個Linq查詢。

假設我只需要擔心單個表,並且表中的列都是字符串/ varchars。

因此,舉例來說,如果我有一個表:

MyTable 
----------------- 
Field1 
Field2 
Field3 
etc. 

與此表已在EF已經產生,我就可以做一些類似如下:

VAR的結果= CreateDynamicQuery (「Field3」,「我的價值」);

我可以將其轉換成EF/Linq查詢。

這需要的原因很複雜,但更常規的查詢機制在這種情況下不起作用。我試圖避免的是一個基於字符串的SQL解決方案。

是這樣的可能嗎?

+0

不是百分之百確定到底你在問什麼,但我認爲LINQ表達式樹http://msdn.microsoft.com/en-us/library/bb397951.aspx可能被用來解決你的問題。 –

+0

這看起來很有希望。基本上我想用這個來通過EF查詢SQL。 –

回答

4

下面是如何建立與LINQ表達式樹和實體框架的查詢做一個簡單的動態查詢的例子:

public void TestEF() 
    { 
     using (DbContext db = new ElFaktura.Data.CustomerEntities()) 
     { 
      var expr = CreateQuery<Customer>("FirstName", "Lorentz"); 
      var result = db.Set<Customer>().Where(expr); 
      Debug.Print(result.ToString()); 
     } 
    } 

    public Expression<Func<Customer, bool>> CreateQuery<T>(string field, string value) 
    { 
     var paramExpr = Expression.Parameter(typeof(T)); 
     var propExpr = Expression.Property(paramExpr, field); 
     var equalsExpr = Expression.Equal(propExpr, Expression.Constant(value)); 
     return Expression.Lambda<Func<Customer,bool>>(equalsExpr, paramExpr); 
    } 

生成的SQL是

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[Email] AS [Email], 
[Extent1].[AddressID] AS [AddressID], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName] 
FROM [dbo].[Customers] AS [Extent1] 
WHERE (N'Lorentz' = [Extent1].[FirstName])