Entity FrameworkでLinqクエリを変換し、式ツリーに変換してシリアル化することでクエリをデータベースに保存できるかどうか疑問に思いました。誰かがこれについて私を助けて、これができるかどうかにかかわらず、正しい方向に私を向けることができますか?どんな助けでもこれに関して大いに感謝されます。
ありがとう、アジェイ。
Entity FrameworkでLinqクエリを変換し、式ツリーに変換してシリアル化することでクエリをデータベースに保存できるかどうか疑問に思いました。誰かがこれについて私を助けて、これができるかどうかにかかわらず、正しい方向に私を向けることができますか?どんな助けでもこれに関して大いに感謝されます。
ありがとう、アジェイ。
昨日、その目的のためにライブラリをリリースしました。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());
クエリを文字列に変換してから、文字列を保存できます。
これはNickBerardiによる回答からです:
var result = from x in appEntities
where x.id = 32
select x;
var sql = ((System.Data.Objects.ObjectQuery)result).ToTraceString();
クエリによって生成されたSQLは、保存して再利用できます。
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パッケージとしても使用できます
この場合、LINQではなくエンティティSQLの使用を検討することをお勧めします。エンティティSQLは、データベースに対して直接ではなく、EF概念モデルに対して機能する文字列クエリです。