2014-01-10 5 views
1

Я пытаюсь определить, возможно ли следующее в качестве первого шага.Возможно ли построить динамический запрос на основе метаданных EF?

По существу, я хотел бы создать механизм, в котором из имени поля (строки) и значения я мог бы динамически найти имя поля в метаданных объекта и создать запрос Linq на основе этой информации.

Предположим, что мне нужно только беспокоиться об одной таблице, а столбцы на таблице - все строки/varchars.

Так, например, если у меня есть таблица:

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

и эта таблица была сформирована в EF, я мог бы сделать что-то вроде следующего:

вар результат = CreateDynamicQuery («Поле3», «мое значение»);

И я смог бы перевести это в запрос EF/Linq.

Причины, по которым это необходимо, сложны, но в этом случае более обычный механизм запросов не будет работать. То, что я пытаюсь избежать, это строковое SQL-решение.

Возможно ли это как можно?

+0

не 100 процентов уверен, что именно что вы спрашиваете, но я думаю, что для решения вашей проблемы могут использоваться деревья выражений LINQ http://msdn.microsoft.com/en-us/library/bb397951.aspx. –

+0

Это выглядит многообещающим. По сути, я хочу использовать это для запроса SQL через EF. –

ответ

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])