私は実行時にいくつかのクエリを生成するためにMicrosoftのダイナミックLinq(System.Linq.Dynamic)ライブラリを使用しています。これは私のためにはうまくいきましたが、1つの特定のシナリオで役に立ちました。outerItを使用して動的Linqクエリを生成
簡略化されたシナリオ - ユーザーが選択したいくつかの特定のタグを持ち、残高がある数よりも大きいクレームをすべて照会しようとしています。
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; }
}
このクエリは、エラーがスローされます。
An unhandled exception of type 'System.Linq.Dynamic.ParseException' occurred in System.Linq.Dynamic.dll Additional information: No property or field 'Balance' exists in type 'String'
ダイナミックLINQパーサーは、タグのないクレームオブジェクトのバランスプロパティを見つけようとしているようです。
- 私はそれは、動的LINQのでキーワード、outerIt、innerItで遊ぶことを試みたが、それのどれも動いていないようにみえます。
- 実際のアプリケーションでは、フィルタ、演算子、パターンは動的(エンドユーザによって設定)になるため、シーケンスを変更することはできますが、それは私の選択肢ではありません。
- ブラケット()内の条件をボクシングも助けにはなりません。
- 回避策 - 選択されたすべてのタグに対して単純な包含条件を作成します。実際のアプリケーションでは、それぞれの条件に対して実際に複雑な/悪いクエリが発生し、パフォーマンスが低下します。
私は何かが不足している可能性があります。これはライブラリに不具合がある可能性があります。
誰かが私に助けてくれたら本当にありがたいです。
どこで、どの文書へのリンクを、このような構文を学びましたか? –
これは私の出発点でした:https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library。それから私は参照を得たから他のSOの質問があった:http://stackoverflow.com/questions/37740409/c-sharp-dynamiclinq-where-clause-with-any –
私が理解するから、 Linq/EFは、少しの構文上の違いがある動的なlinqに対してすべきです。 –