4

我想知道我们是否可以在实体框架上转换 Linq 查询,并通过将查询转换为表达式树和序列化来将查询保存到数据库中。有人可以帮我解决这个问题,并为我指明正确的方向,无论这是否可以完成。非常感谢您对此的任何帮助。

谢谢,阿杰。

4

4 回答 4

3

就在昨天,我为此目的发布了一个库。序列化.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());
于 2012-09-22T10:15:14.043 回答
1

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

这是来自Nick Berardi的回答

var result = from x in appEntities
         where x.id = 32
         select x;

var sql = ((System.Data.Objects.ObjectQuery)result).ToTraceString();

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

于 2012-07-09T23:41:15.710 回答
1

使用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 包

于 2015-06-18T00:42:59.240 回答
0

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

于 2014-03-06T18:45:52.970 回答