我正在尝试确定以下是否可行作为第一步。
基本上我想创建一种机制,通过字段名称(字符串)和值,我可以在实体的元数据中动态查找字段名称,并根据该信息创建Linq查询。
假设我只需要担心单个表,并且表上的列都是字符串/ varchars。
所以,例如,如果我有一张桌子:
MyTable
-----------------
Field1
Field2
Field3
etc.
此表已在EF中生成,我可以执行以下操作:
var result = CreateDynamicQuery(“Field3”,“my value”);
我可以将其转换为EF / Linq查询。
需要这样做的原因很复杂,但更常规的查询机制在这种情况下不起作用。我想避免的是一个基于字符串的SQL解决方案。
这样的事情可能吗?
答案 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])