将实体框架Linq查询保存到数据库

将实体框架Linq查询保存到数据库,linq,serialization,entity-framework-4,expression-trees,Linq,Serialization,Entity Framework 4,Expression Trees,我想知道我们是否可以在实体框架上转换Linq查询,并通过将其转换为表达式树并序列化将查询保存到数据库。有人能在这方面帮助我,并指出一个正确的方向,我是否可以做到这一点。非常感谢您在这方面的任何帮助 谢谢, Ajay.您可以将查询转换为字符串,然后保存该字符串 这是由以下人员编写的: 查询生成的sql可以存储和重用。我昨天发布了一个用于此目的的库。它将linq表达式序列化为xml、json或二进制 using System.Linq.Expressions using Serialize.Linq

我想知道我们是否可以在实体框架上转换Linq查询,并通过将其转换为表达式树并序列化将查询保存到数据库。有人能在这方面帮助我,并指出一个正确的方向,我是否可以做到这一点。非常感谢您在这方面的任何帮助

谢谢,
Ajay.

您可以将查询转换为字符串,然后保存该字符串

这是由以下人员编写的:


查询生成的sql可以存储和重用。

我昨天发布了一个用于此目的的库。它将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());
使用System.Linq.Expressions
使用Serialize.Linq.Extensions;
表达式查询=p=>p.LastName==“Miller”
&&p.FirstName.StartsWith(“M”);
WriteLine(query.ToJson());
Console.WriteLine(query.ToXml());

在这种情况下,您可能需要考虑使用而不是LINQ。实体SQL是针对EF概念模型而不是直接针对数据库的字符串查询

使用。它将
Func
转换为字符串并返回到代码

样本:

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;
}
公共类TestSprintOData
{
公共静态无效运行()
{
//将Func解析为字符串
var query=Filter.Serialize(u=>u.IsActive&&u.Email.Contains(“@gmail.com”);
//它将生成字符串“IsActive和substringof('@gmail.com',Email)”
//转换回表达式,可能在服务器上
var query2=过滤器。反序列化(查询);
//编译为Func,因此您可以将其用作其中的委托
var f=query2.Compile();
变量列表=新列表
{
新用户{Name=“Johnny”,IsActive=true,Email=johnny@gmail.com"},
新用户{Name=“abc”,IsActive=false,Email=”“},
新用户{Name=“dude”,IsActive=true,Email=dude@gmail.com"}
};
var结果=列表,其中(f);
}
}
类用户
{
公共字符串名称;
公用串电话;
公共字符串登录;
公共字符串电子邮件;
公共福利活动;
}

您也可以将其用作

抱歉,没有明确询问。基本上,我想将linq谓词作为字符串保存到数据库中,并读取值以在运行时运行linq谓词。请告诉我是否有一种方法可以做到这一点,或者是否有更好的方法?您好,将跟踪字符串转换回工作查询的代码是什么?我喜欢您的答案,因为它不必根据查询结果的类型键入。@toddmo-返回到工作查询中?
结果就是查询。获取跟踪字符串只是显示查询的内容。因此,如果您想要查询结果,只需查看
result
,可能会忽略跟踪字符串,因为它更多的是用于分析和调试,而不是用于生产。@TravisJ,不是我的意思,是内存中的Linq查询表达式。在本例中,将其转换回内存中的
结果
。与中一样,先序列化它,然后反序列化它。@toddmo-您不需要序列化字符串,只需按原样使用即可
var-storedResult=context.MyTableName.SqlQuery(sql)能否将序列化查询转换回表达式序列?是的,可以。看一看example@esskar,链接现在已断开。你能发布一个包含你代码的答案吗?
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;
}