4

Entity FrameworkでLinqクエリを変換し、式ツリーに変換してシリアル化することでクエリをデータベースに保存できるかどうか疑問に思いました。誰かがこれについて私を助けて、これができるかどうかにかかわらず、正しい方向に私を向けることができますか?どんな助けでもこれに関して大いに感謝されます。

ありがとう、アジェイ。

4

4 に答える 4

3

昨日、その目的のためにライブラリをリリースしました。Serialize.Linq。linq式をxml、json、またはbinaryにシリアル化します。

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

クエリを文字列に変換してから、文字列を保存できます。

これはNickBerardiによる回答からです:

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を使用します。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

この場合、LINQではなくエンティティSQLの使用を検討することをお勧めします。エンティティSQLは、データベースに対して直接ではなく、EF概念モデルに対して機能する文字列クエリです。

于 2014-03-06T18:45:52.970 に答える