我正在尝试使用动态查询库选择以某些内容开头的字段,我被限制在变量中使用列名和字段。我试过了:
var x = myqueriable.Where("" + X1 + " LIKE @0 and " + X2 + "= @1 ", Y1 + "%", Y2);我有错误:"system.Linq.Dynamic.ParseException: expected>类型的表达式
有没有办法实现上面提到的目标?
发布于 2019-04-19 22:26:16
var x = myQueryable.Where(y => y.StartsWith(param0));发布于 2019-04-20 03:56:05
您需要构建动态lambda表达式,如下所示
p => p.Property.StartsWith("some prefix");通过使用内置的表达式API,您可以在没有外部库的情况下完成此操作。请参阅此扩展方法:
public static class QueryableExt
{
public static Expression<Func<T, bool>> BuildLambda<T>(this IQueryable<T> input, string propertyName, string startsWith)
{
var elemenType = input.ElementType;
var property = elemenType.GetProperty(propertyName);
if (property == null)
throw new ArgumentException($"There is no property {propertyName} in {elemenType.Name}");
if (property.PropertyType != typeof(string))
throw new ArgumentException($"Expected string property but actual type is {property.PropertyType.Name}");
var startsWithMethod = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
var p = Expression.Parameter(elemenType, "p"); // p => ...
var memberExpression = Expression.Property(p, property); // ... p.Propery
var startsWithValue = Expression.Constant(startsWith); // "some prefix"
var startsWithExpression = Expression.Call(memberExpression, startsWithMethod, startsWithValue); // ... p.Property.StartsWith("some prefix")
var result = Expression.Lambda<Func<T, bool>>(startsWithExpression, p); // p => p.Property.StartsWith("some prefix")
return result;
}
}请注意,BuildLambda比字符串连接更安全:此方法实际检查propertyName是否存在以及是否具有有效类型。现在你可以像这样使用它
var x = myqueriable.Where(myqueriable.BuildLambda(X, Y))发布于 2019-04-20 15:47:27
在使用System.Linq.Dynamic.Core时,您应该能够使用StartsWith()。
示例代码:
var result = Entity1s.Where("Url.StartsWith(\"x\")");它被翻译成SQL,如下所示:
-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'x%'
-- EndRegion
SELECT [t0].[Id], [t0].[Url], [t0].[Rating]
FROM [Entity1] AS [t0]
WHERE [t0].[Url] LIKE @p0https://stackoverflow.com/questions/55763314
复制相似问题