我正在嘗試遵循本指南,該指南指出這在動態 LINQ 中應該是可能的:
var config = new ParsingConfig { ResolveTypesBySimpleName = true };
var example2 = Cars.Where(config, "DynamicFunctions.Like(Brand, \"%t%\")");
example2.Dump();
我正在使用字串連接來構建一個復雜的查詢:
IQueryable<DtcViewEntity> queryable = ...
string[] values = { "%a%" };
string myOperator = "and"; // or sometimes "or"
bool isNot = false; // or sometimes "true"
var query = string.Join($" {myOperator} ", values.Select((value, index) => $"DynamicFunctions.Like(MyColumn, @{index})"));
if (isNot) query = $"not ({query})";
var config = new ParsingConfig { ResolveTypesBySimpleName = true };
return queryable.Where(config, query, values);
但是可以使用與指南中的示例幾乎相同的代碼來重現實際錯誤:
IQueryable<DtcViewEntity> queryable = ...
var config = new ParsingConfig { ResolveTypesBySimpleName = true };
var result = queryable.Where(config, "DynamicFunctions.Like(MyColumn, \"%a%\")").ToList();
我得到:
System.Linq.Dynamic.Core.Exceptions.ParseException : Enum type 'DynamicFunctions' not found
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAsEnum(String id)
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseMemberAccess(Type type, Expression expression)
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIdentifier()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimaryStart()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimary()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseUnary()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseMultiplicative()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAdditive()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseShiftOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseComparisonOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLogicalAndOrOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIn()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAndOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseOrOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLambdaOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseNullCoalescingOperator()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseConditionalOperator()
我也看過這段代碼,但是使用var config = ParsingConfig.DefaultEFCore21;會導致
System.Linq.Dynamic.Core.Exceptions.ParseException : Enum type 'DynamicFunctions' not found
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAsEnum(String id)
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseMemberAccess(Type type, Expression expression)
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIdentifier()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimaryStart()
at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimary()
添加Microsoft.EntityFrameworkCore.DynamicLinq到依賴項后,我得到:
System.Linq.Dynamic.Core.Exceptions.ParseException : No applicable method 'Like' exists in type 'DynamicFunctions'
Falco Alexander甚至從 ZZZ Projects 中找到了一個“作業示例”,它產生了完全相同的錯誤訊息:
Unhandled exception. Enum type 'DynamicFunctions' not found (at index 21)
Command terminated by signal 6
我找不到有關此例外的任何資訊,所以我的問題是:我做錯了什么?
uj5u.com熱心網友回復:
看起來您遇到的錯誤與 Linq 無法“轉換”資料因此它可以決議它或類似的東西有關您是否可以使用“包含”而不是“喜歡”運算子?
var Something = SomethingElse.Filter(x => x.Argument.Contains(Description));
uj5u.com熱心網友回復:
從此答案獲取擴展方法。它包含GetItemsPredicate有助于構建謂詞的功能。
然后我們可以生成所需的謂詞,而無需Dynamic.Linq并避免原始文本決議。
// input parameters
string[] values = { "%a%" };
var isOr = true;
var isNot = false;
var predicate = queryable.GetItemsPredicate(values, (e, v) => EF.Functions.Like(e.MyColumn, v), isOr);
if (isNot)
{
// inversion
predicate = Expression.Lambda<Func<DtcViewEntity, bool>>(Expression.Not(predicate.Body), predicate.Parameters);
}
// applying generated predicate
queryable = queryable.Where(predicate);
uj5u.com熱心網友回復:
如果我直接使用 EF.Functions,我的代碼運行良好
var result = context.Cars.Where(c => EF.Functions.Like(c.Brand, "%a%")).ToList();
還使用不同的非 EF 提供程式使用 Linqpad 和 Northwind localDB 進行測驗。
var config = new ParsingConfig { ResolveTypesBySimpleName = true };
var example2 = from c in Customers
where SqlMethods.Like(c.City, "[aeiou]%")
select c;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/525624.html
上一篇:具有一對多導航屬性中的記錄數
