有没有一种方法可以在linq查询中参数化方法?

布衣工

在使用Linq to SQL的应用程序中,用户可以搜索文本。搜索表达式的开头和/或结尾可以使用星号(*)。现在的代码是这样的:

var search = SearchTextBox.Text.Trim();
bool filterStartsWith = false, filterEndsWith = false;
if (!string.IsNullOrEmpty(search))
{
    filterStartsWith = search.EndsWith("*");
    filterEndsWith = search.StartsWith("*");
    if (filterStartsWith) search = search.Substring(0, search.Length - 1);
    if (filterEndsWith) search = search.Substring(1);

    if (filterStartsWith)
    {
        if (filterEndsWith)
        {
            query = query.Where(item => item.Omschrijving.Contains(search));
        }
        else
        {
            query = query.Where(item => item.Omschrijving.StartsWith(search));
        }
    }
    else
    {
        if (filterEndsWith)
        {
            query = query.Where(item => item.Omschrijving.EndsWith(search));
        }
        else
        {
            query = query.Where(item => item.Omschrijving == search);
        }
    }
}

但是,我想对此进行概括,因为这种搜索发生在更多的地方。另外,对于某些表,这应该在多个列上发生。有任何想法吗?

我将Visual Studio 2010与.NET Framework 4.0结合使用。

克里斯·范德莫顿

您可以尝试以下方法:

static IQueryable<T> WhereColumnContains<T>(this IQueryable<T> source, Expression<Func<T, string>> selector, string search)
{
    if (string.IsNullOrWhiteSpace(search))
    {
        return source;
    }

    Expression<Func<T, bool>> expression;

    search = search.Trim();

    var filterStartsWith = search.EndsWith("*");
    var filterEndsWith = search.StartsWith("*");

    if (filterEndsWith) search = search.Substring(1);

    if (filterStartsWith)
    {
        search = search.Substring(0, search.Length - 1);

        if (filterEndsWith)
        {
            var parameter = Expression.Parameter(typeof(T), "parameter");

            expression = Expression.Lambda<Func<T, bool>>(
                Expression.Call(Expression.Invoke(selector, parameter), typeof(string).GetMethod("Contains", new[] { typeof(string) }), Expression.Constant(search)),
                parameter);
        }
        else
        {
            var parameter = Expression.Parameter(typeof(T), "parameter");

            expression = Expression.Lambda<Func<T, bool>>(
                Expression.Call(Expression.Invoke(selector, parameter), typeof(string).GetMethod("StartsWith", new[] { typeof(string) }), Expression.Constant(search)),
                parameter);
        }
    }
    else
    {
        if (filterEndsWith)
        {
            var parameter = Expression.Parameter(typeof(T), "parameter");

            expression = Expression.Lambda<Func<T, bool>>(
                Expression.Call(Expression.Invoke(selector, parameter), typeof(string).GetMethod("EndsWith", new[] { typeof(string) }), Expression.Constant(search)),
                parameter);
        }
        else
        {
            var parameter = Expression.Parameter(typeof(T), "parameter");

            expression = Expression.Lambda<Func<T, bool>>(
                Expression.Equal(Expression.Invoke(selector, parameter), Expression.Constant(search)),
                parameter);
        }
    }

    return source.Where(expression);
}

调用如下:

query = query.WhereColumnContains(item => item.Omschrijving, search);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以根据参数更改LINQ查询orderBy?

来自分类Dev

有没有一种方法可以在@Path批注中指定查询参数?

来自分类Dev

有没有一种方法可以设置Calabash触摸或查询的参数

来自分类Dev

有没有一种方法可以处理SQLKata中的现有查询?

来自分类Dev

有没有一种方法可以确定angular.js中是否存在url查询参数?

来自分类Dev

有没有一种方法可以在单语句SQL查询中定义命名常量/参数?

来自分类Dev

有没有一种方法可以强制httpie对查询参数中的空格使用'%20'而不是'+'?

来自分类Dev

有没有一种方法可以确定angular.js中是否存在URL查询参数?

来自分类Dev

有没有一种方法可以使Excel VBA中的查询列动态化?

来自分类Dev

有没有一种方法可以表示查询中的位置值?

来自分类Dev

有没有一种方法可以“参数化” .net中连续命名的控件

来自分类Dev

有没有一种方法可以重用fmt.Printf中的参数?

来自分类Dev

有没有一种方法可以简化具有多对一关系的Linq查询?

来自分类Dev

有没有一种方法可以简化具有多对一关系的Linq查询?

来自分类Dev

有没有一种方法可以阻止LINQ查询在LINQPAD之类的工具中检索所有嵌套查询?

来自分类Dev

有没有一种方法可以强制将LINQ中生成的查询的const内联到SQL?

来自分类Dev

有没有一种方法可以使用System.Linq.Dynamic查询类型

来自分类Dev

有没有一种方法可以从LINQ查询的.include(中选择某些字段?

来自分类Dev

有没有一种方法可以保存带有参数的函数调用?

来自分类Dev

有没有一种方法可以保存带有参数的函数调用?

来自分类Dev

有没有一种方法可以用雄辩的基于输入的参数构建查询?

来自分类Dev

有没有一种方法可以通过routerLink / router.navigate附加查询/路由参数?

来自分类Dev

有没有一种方法可以用雄辩的基于输入的参数构建查询?

来自分类Dev

有没有一种方法可以在Linq2Db中多次引用已编译查询中的同一CTE?

来自分类Dev

有没有一种方法可以在Linq2Db中多次引用已编译查询中的同一CTE?

来自分类Dev

有没有一种方法可以通过LINQ语句获得行数?

来自分类Dev

有没有一种方法可以从方法中测试参数错误以返回true或false?

来自分类Dev

有没有一种方法可以将class方法作为python中的关键参数(sort / min / ..)?

来自分类Dev

有没有一种方法可以从方法中测试参数错误以返回true或false?

Related 相关文章

  1. 1

    有没有一种方法可以根据参数更改LINQ查询orderBy?

  2. 2

    有没有一种方法可以在@Path批注中指定查询参数?

  3. 3

    有没有一种方法可以设置Calabash触摸或查询的参数

  4. 4

    有没有一种方法可以处理SQLKata中的现有查询?

  5. 5

    有没有一种方法可以确定angular.js中是否存在url查询参数?

  6. 6

    有没有一种方法可以在单语句SQL查询中定义命名常量/参数?

  7. 7

    有没有一种方法可以强制httpie对查询参数中的空格使用'%20'而不是'+'?

  8. 8

    有没有一种方法可以确定angular.js中是否存在URL查询参数?

  9. 9

    有没有一种方法可以使Excel VBA中的查询列动态化?

  10. 10

    有没有一种方法可以表示查询中的位置值?

  11. 11

    有没有一种方法可以“参数化” .net中连续命名的控件

  12. 12

    有没有一种方法可以重用fmt.Printf中的参数?

  13. 13

    有没有一种方法可以简化具有多对一关系的Linq查询?

  14. 14

    有没有一种方法可以简化具有多对一关系的Linq查询?

  15. 15

    有没有一种方法可以阻止LINQ查询在LINQPAD之类的工具中检索所有嵌套查询?

  16. 16

    有没有一种方法可以强制将LINQ中生成的查询的const内联到SQL?

  17. 17

    有没有一种方法可以使用System.Linq.Dynamic查询类型

  18. 18

    有没有一种方法可以从LINQ查询的.include(中选择某些字段?

  19. 19

    有没有一种方法可以保存带有参数的函数调用?

  20. 20

    有没有一种方法可以保存带有参数的函数调用?

  21. 21

    有没有一种方法可以用雄辩的基于输入的参数构建查询?

  22. 22

    有没有一种方法可以通过routerLink / router.navigate附加查询/路由参数?

  23. 23

    有没有一种方法可以用雄辩的基于输入的参数构建查询?

  24. 24

    有没有一种方法可以在Linq2Db中多次引用已编译查询中的同一CTE?

  25. 25

    有没有一种方法可以在Linq2Db中多次引用已编译查询中的同一CTE?

  26. 26

    有没有一种方法可以通过LINQ语句获得行数?

  27. 27

    有没有一种方法可以从方法中测试参数错误以返回true或false?

  28. 28

    有没有一种方法可以将class方法作为python中的关键参数(sort / min / ..)?

  29. 29

    有没有一种方法可以从方法中测试参数错误以返回true或false?

热门标签

归档