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

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

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

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

假设我只需要关心单个表,表上的列都是strings/varchars。

例如,如果我有一张 table :

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

并且此表已在 EF 中生成,我将能够执行如下操作:

var result = CreateDynamicQuery("Field3", "我的值");

而且我能够将其转换为 EF/Linq 查询。

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

这样的事情可能吗?

最佳答案

下面是一个示例,说明如何使用 linq 表达式树和 Entity Framework 构建查询以进行简单的动态查询:

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

关于c# - 是否可以构建基于 EF 元数据的动态查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21050521/

相关文章:

c# - 将 Word 中的文本替换为 C# 表单中的文本

c# - 必需属性不适用于外键下拉列表

mysql - 如何限制实体属性值中的属性名称?

entity-framework - Entity Framework 1 对 1 关系首先使用代码。如何?

java - 不满意的依赖异常 : Error creating bean with name 'trafficMapper'

c# - 检查对象是否满足通用参数约束

c# - EF 代码首先无法将类型转换为 int

c# - 检查集合中的项目是否与任何其他项目匹配的 Linq 方法

c# - Automapper ProjectTo 将 ToList 添加到子属性中

c# - 在匿名方法中使用 MethodInfo.GetCurrentMethod()