【问题标题】:Perform an OR of two LINQ IQueryables执行两个 LINQ IQueryable 的 OR
【发布时间】:2012-05-09 02:50:16
【问题描述】:

我有两个 IQueryable:

    public static IQueryable<Counterparty> SearchByCode(this IQueryable<Counterparty> queryable, string searchQuery)
    {
        return queryable.Where(x => x.Code.StartsWith(searchQuery.ToUpper()));
    }

    public static IQueryable<Counterparty> SearchByName(this IQueryable<Counterparty> queryable, string searchQuery)
    {
        return queryable.Where(x => x.Name.ToLower().Contains(searchQuery.ToLower()));
    }

我想创建另一个 IQueryable,它将两个查询组合为 OR,例如

    public static IQueryable<Counterparty> SearchByCodeOrName(this IQueryable<Counterparty> queryable, string searchQuery)
    {
        // return SearchByName(searchQuery) OR SearchByCode(searchQuery)
    }

我宁愿避免重复代码,所以我想重用现有的可查询对象,而不是重写一个新的 lambda 表达式,如 Where(x=&gt; x.Code.StartsWith.... || x.Name.Contains.....)

【问题讨论】:

    标签: linq entity-framework linq-to-sql


    【解决方案1】:

    您可能可以将两者的结果合并在一起

    public static IQueryable<Counterparty> SearchByCodeOrName(this IQueryable<Counterparty> queryable, string searchQuery)
    {
         return SearchByName(searchQuery).Union(SearchByCode(searchQuery))
    }
    

    【讨论】:

    • 绝对是最简洁的方法,但我不确定这是否会导致实体框架中的数据库两次往返......
    【解决方案2】:

    根据您确实希望能够重用的代码,这可能是一种替代方法,您不会重复查询条件的内部工作:

        private static Func<Counterparty, string, bool> CodeStartsWith = (x, searchQuery) => x.Code.StartsWith(searchQuery.ToUpper());
    
        private static Func<Counterparty, string, bool> NameContains = (x, searchQuery) => x.Name.Contains(searchQuery.ToLower());
    
        public static IQueryable<Counterparty> SearchByCode(this IQueryable<Counterparty> queryable, string searchQuery)
        { 
            return queryable.Where(x => CodeStartsWith(x, searchQuery)); 
        }
    
        public static IQueryable<Counterparty> SearchByName(this IQueryable<Counterparty> queryable, string searchQuery)
        {
            return queryable.Where(x => NameContains(x, searchQuery)); 
        }
    
        public static IQueryable<Counterparty> SearchByCodeOrName(this IQueryable<Counterparty> queryable, string searchQuery)
        {
            return queryable.Where(x => NameContains(x, searchQuery) || CodeStartsWith(x, searchQuery)); 
        }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2020-12-08
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多