Ich verwende System.Linq.Dynamic , um eine IQueryable-Datenquelle mithilfe einer where-Klausel in einem Zeichenfolgenformat wie folgt dynamisch abzufragen:
var result = source.Entities.Where("City = @0", new object[] { "London" });
Das obige Beispiel funktioniert gut. Aber jetzt möchte ich eine Fremdschlüsseleigenschaft vom Typ Guid wie folgt abfragen:
var result = source.Entities.Where("CompanyId = @0", new object[] { "838AD581-CEAB-4B44-850F-D05AB3D791AB" });
Dies funktioniert nicht, da eine Guid standardmäßig nicht mit einer Zeichenfolge verglichen werden kann. Und ich muss die Guid als Zeichenfolge angeben, da sie ursprünglich aus einer JSON-Anfrage stammt und JSON keine Guids unterstützt.
Ist dies überhaupt eine korrekte Methode zum Abfragen einer Beziehung oder gibt es eine andere Syntax dafür?
Zweitens, wie ändere ich Dynamic.cs aus dem Dynamic Linq-Projekt, um eine Zeichenfolge automatisch in guid zu konvertieren, wenn die Entitätseigenschaft, mit der verglichen wird, vom Typ guid ist?
Sie haben viele Möglichkeiten zum Lösen. Am einfachsten, wie ich denke, ist es, Ihre Anfrage so zu ändern
var result = source.Entities.Where("CompanyId.Equals(@0)", new object[] { Guid.Parse("838AD581-CEAB-4B44-850F-D05AB3D791AB") });
Wenn Sie operator =
und ==
Dynamic.cs
, müssen Sie in Dynamic.cs
die interface IEqualitySignatures : IRelationalSignatures
wie interface IEqualitySignatures : IRelationalSignatures
interface IEqualitySignatures : IRelationalSignatures
{
....
F(Guid x, Guid y);
....
}
Danach können Sie die nächste Abfrage verwenden
var result = source.Entities.Where("CompanyId=@0", new object[] { Guid.Parse("838AD581-CEAB-4B44-850F-D05AB3D791AB") });
ODER
var result = source.Entities.Where("CompanyId==@0", new object[] { Guid.Parse("838AD581-CEAB-4B44-850F-D05AB3D791AB") });
Wenn Sie jedoch einen string
möchten, müssen Sie die ParseComparison
Methode in der ExpressionParser
Klasse ändern. Sie müssen noch eine weitere Überprüfung für Operandentypen wie diesen hinzufügen
....
//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);
}
....
und dann wird Ihre Abfrage Arbeit sein
var result = source.Entities.Where("CompanyId = @0", new object[] { "838AD581-CEAB-4B44-850F-D05AB3D791AB" });