Microsoftの動的Linq(System.Linq.Dynamic)ライブラリを使用して、実行時にクエリを生成しています。これは私にとってはうまくいきましたが、ある特定のシナリオではうまくいきました。
簡略化されたシナリオ-ユーザーが選択した特定のタグがあり、残高が特定の数値より大きいすべてのクレームをクエリしようとしています。
static void Main(string[] args)
{
var claims = new List<Claim>();
claims.Add(new Claim { Balance = 100, Tags = new List<string> { "Blah", "Blah Blah" } });
claims.Add(new Claim { Balance = 500, Tags = new List<string> { "Dummy Tag", "Dummy tag 1" } });
// tags to be searched for
var tags = new List<string> { "New", "Blah" };
var parameters = new List<object>();
parameters.Add(tags);
var query = claims.AsQueryable().Where("Tags.Any(@0.Contains(outerIt)) AND Balance > 100", parameters.ToArray());
}
public class Claim
{
public decimal? Balance { get; set; }
public List<string> Tags { get; set; }
}
このクエリはエラーをスローします。
タイプSystem.Linq.Dynamic.ParseExceptionの未処理の例外がSystem.Linq.Dynamic.dllで発生しました追加情報:タイプ 'String'にプロパティまたはフィールド 'Balance'が存在しません
動的linqパーサーは、Claimオブジェクトではなく、TagでBalanceプロパティを検索しようとしているようです。
何かが足りないか、ライブラリのバグである可能性があります。
誰かがこれを手伝ってくれると本当にありがたいです。
ParseAggregateのバグが見つかりました...複数のレベルがある場合、 it
プッシュする– outerIt
とbackを押しても機能しません。コードは、 it
およびouterIt
がリセットされる前にサードパーティによって変更されないit
を想定しています(技術的にはコードは再入可能ではありません)。 System.Linq.Dynamic
他のバリアントを試すことができSystem.Linq.Dynamic
(そこには2つまたは3つのバリアントがあります)。おそらくいくつかの亜種はすでにそれを修正しています。
または、リンクされたサイトからコードを取得してコード内で再コンパイルし(最後に「元の」System.Linq.Dynamicは単一のcsファイルです)、次のようにパッチを適用できます。
Expression ParseAggregate(Expression instance, Type elementType, string methodName, int errorPos)
{
// Change starts here
var originalIt = it;
var originalOuterIt = outerIt;
// Change ends here
outerIt = it;
ParameterExpression innerIt = Expression.Parameter(elementType, elementType.Name);
it = innerIt;
Expression[] args = ParseArgumentList();
// Change starts here
it = originalIt;
outerIt = originalOuterIt;
// Change ends here
MethodBase signature;
if (FindMethod(typeof(IEnumerableSignatures), methodName, false, args, out signature) != 1)
プロジェクトのgithubで提案されたバグ修正を使用して課題をすでに開いています。
これは私のバージョンで正しく動作しているようです: System.Linq.Dynamic.Core
ここでテストを参照してください: https : //github.com/StefH/System.Linq.Dynamic.Core/blob/master/test/System.Linq.Dynamic.Core.Tests/ComplexTests.cs#L19