我正在使用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與字符串進行比較。而且我必須提供Guid作為字符串,因為它最初來自json-request,而json不支持guid。
首先,這是否是查詢關係的正確方法,還是有其他語法可以做到這一點?
其次,如果要比較的實體屬性為guid類型,如何從Dynamic Linq項目中修改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
{
....
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" });