System.Linq.Dynamicを使用して、次のように文字列形式のwhere句を使用して動的にIQueryableデータソースをクエリしています。
var result = source.Entities.Where("City = @0", new object[] { "London" });
上記の例はうまくいきます。しかし、次のようにタイプGuidの外部キープロパティを照会したいと思います。
var result = source.Entities.Where("CompanyId = @0", new object[] { "838AD581-CEAB-4B44-850F-D05AB3D791AB" });
デフォルトでは、Guidを文字列と比較できないため、これは機能しません。そして、それはもともとjson-requestから来ており、jsonはguidをサポートしていないので、私はguidを文字列として提供する必要があります。
まず、これは関係を照会する正しい方法でもありますか、またはこれを行うための他の構文はありますか?
次に、比較対象のエンティティプロパティのタイプがguidである場合、Dynamic LincsプロジェクトのDynamic.csを変更して、文字列をguidに自動的に変換するにはどうすればよいですか?
解決する方法はたくさんあります。私が思うに最も簡単なのは、このようにクエリを変更することです
var result = source.Entities.Where("CompanyId.Equals(@0)", new object[] { Guid.Parse("838AD581-CEAB-4B44-850F-D05AB3D791AB") });
演算子=
と==
使用する場合は、 Dynamic.cs
interface IEqualitySignatures : IRelationalSignatures
変更する必要がありinterface IEqualitySignatures : IRelationalSignatures
このようなinterface IEqualitySignatures : IRelationalSignatures
interface IEqualitySignatures : IRelationalSignatures
{
....
F(Guid x, Guid y);
....
}
その後、次のクエリを使用できます
var result = source.Entities.Where("CompanyId=@0", new object[] { Guid.Parse("838AD581-CEAB-4B44-850F-D05AB3D791AB") });
または
var result = source.Entities.Where("CompanyId==@0", new object[] { Guid.Parse("838AD581-CEAB-4B44-850F-D05AB3D791AB") });
ただし、 string
パラメーターを使用する場合は、 ExpressionParser
クラスのParseComparison
メソッドを変更する必要があります。このようなオペランドタイプのチェックをさらに追加する必要があります
....
//you need add this condition
else if(left.Type==typeof(Guid) && right.Type==typeof(string)){
right = Expression.Call(typeof(Guid).GetMethod("Parse"), right);
}
//end condition
else {
CheckAndPromoteOperands(isEquality ? typeof(IEqualitySignatures) : typeof(IRelationalSignatures), op.text, ref left, ref right, op.pos);
}
....
その後、クエリは機能します
var result = source.Entities.Where("CompanyId = @0", new object[] { "838AD581-CEAB-4B44-850F-D05AB3D791AB" });