首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在dynamic-linq库中有没有办法选择...列的开头为

在dynamic-linq库中有没有办法选择...列的开头为
EN

Stack Overflow用户
提问于 2019-04-19 22:22:18
回答 3查看 414关注 0票数 1

我正在尝试使用动态查询库选择以某些内容开头的字段,我被限制在变量中使用列名和字段。我试过了:

代码语言:javascript
复制
var x = myqueriable.Where("" + X1  + " LIKE @0 and "  + X2 + "= @1 ", Y1 + "%", Y2);

我有错误:"system.Linq.Dynamic.ParseException: expected>类型的表达式

有没有办法实现上面提到的目标?

EN

回答 3

Stack Overflow用户

发布于 2019-04-19 22:26:16

代码语言:javascript
复制
var x = myQueryable.Where(y => y.StartsWith(param0));
票数 1
EN

Stack Overflow用户

发布于 2019-04-20 03:56:05

您需要构建动态lambda表达式,如下所示

代码语言:javascript
复制
p => p.Property.StartsWith("some prefix");

通过使用内置的表达式API,您可以在没有外部库的情况下完成此操作。请参阅此扩展方法:

代码语言:javascript
复制
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是否存在以及是否具有有效类型。现在你可以像这样使用它

代码语言:javascript
复制
var x = myqueriable.Where(myqueriable.BuildLambda(X, Y))
票数 0
EN

Stack Overflow用户

发布于 2019-04-20 15:47:27

在使用System.Linq.Dynamic.Core时,您应该能够使用StartsWith()

示例代码:

代码语言:javascript
复制
var result = Entity1s.Where("Url.StartsWith(\"x\")");

它被翻译成SQL,如下所示:

代码语言:javascript
复制
-- Region Parameters
DECLARE @p0 NVarChar(1000) = 'x%'
-- EndRegion
SELECT [t0].[Id], [t0].[Url], [t0].[Rating]
FROM [Entity1] AS [t0]
WHERE [t0].[Url] LIKE @p0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55763314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档