我想知道我们是否可以在实体框架上转换 Linq 查询,并通过将查询转换为表达式树和序列化来将查询保存到数据库中。有人可以帮我解决这个问题,并为我指明正确的方向,无论这是否可以完成。非常感谢您对此的任何帮助。
谢谢,阿杰。
我想知道我们是否可以在实体框架上转换 Linq 查询,并通过将查询转换为表达式树和序列化来将查询保存到数据库中。有人可以帮我解决这个问题,并为我指明正确的方向,无论这是否可以完成。非常感谢您对此的任何帮助。
谢谢,阿杰。
就在昨天,我为此目的发布了一个库。序列化.Linq。它将 linq 表达式序列化为 xml、json 或二进制文件。
using System.Linq.Expressions
using Serialize.Linq.Extensions;
Expression<Func<Person, bool>> query = p => p.LastName == "Miller"
&& p.FirstName.StartsWith("M");
Console.WriteLine(query.ToJson());
Console.WriteLine(query.ToXml());
使用Sprint.Filter.OData。它将 a 转换Func<T,bool>
为字符串并返回代码。
样本:
public class TestSprintOData
{
public static void Run()
{
// Parse a Func into string
var query = Filter.Serialize<User>(u => u.IsActive && u.Email.Contains("@gmail.com"));
// It'll generate the string "IsActive and substringof('@gmail.com', Email)"
// Convert back to Expression, perhaps on server
var query2 = Filter.Deserialize<User>(query);
// Compiles to Func, so you can use as delegate to Where
var f = query2.Compile();
var list = new List<User>
{
new User{Name="Johnny", IsActive = true, Email = "johnny@gmail.com"},
new User{Name="abc", IsActive = false, Email = ""},
new User{Name="dude", IsActive=true, Email = "dude@gmail.com"}
};
var result = list.Where(f);
}
}
class User
{
public string Name;
public string Phone;
public string Login;
public string Email;
public bool IsActive;
}
您也可以将其用作Nuget 包
在这种情况下,您可能需要考虑使用Entity SQL而不是 LINQ。实体 SQL 是一个字符串查询,它针对您的 EF 概念模型而不是直接针对数据库。