是否可以构建基于EF元数据的动态查询?

时间:2014-01-10 17:22:42

标签: c# entity-framework reflection ef-database-first

我正在尝试确定以下是否可行作为第一步。

基本上我想创建一种机制,通过字段名称(字符串)和值,我可以在实体的元数据中动态查找字段名称,并根据该信息创建Linq查询。

假设我只需要担心单个表,并且表上的列都是字符串/ varchars。

所以,例如,如果我有一张桌子:

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

此表已在EF中生成,我可以执行以下操作:

var result = CreateDynamicQuery(“Field3”,“my value”);

我可以将其转换为EF / Linq查询。

需要这样做的原因很复杂,但更常规的查询机制在这种情况下不起作用。我想避免的是一个基于字符串的SQL解决方案。

这样的事情可能吗?

1 个答案:

答案 0 :(得分: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])