作为第一步,我正在尝试确定以下操作是否可行。
本质上,我想创建一种机制,从字段名称(字符串)和值中,我可以动态地在实体的元数据中找到字段名称,并根据该信息创建 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/