最近在做一个webAPI 的时候遇到一个需要合并多个predicate条件的问题,下面就是对题的情况。为了方便交流我对case进行了简化,请先看如下代码:

using System.Collections.Generic;
using System.Linq; namespace CombineLinqPredicates
{
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
} class Program
{
static void Main(string[] args)
{
var customers = GetCustomers(); var filterCustomers = customers.Where(x => x.Id == );
} private static IEnumerable<Customer> GetCustomers()
{
return new List<Customer>()
{
new Customer(){Id=,Name="Alibaba",Url= "http://www.taobao.com"},
new Customer(){Id=,Name="Jd",Url= "http://www.jd.com"},
new Customer(){Id=,Name="Tencent",Url= "http://www.qq.com"}
};
}
}
}

代码非常简单,一个customer 对象有三个属性,id, name 和 url.  和一个过去customer list的方法 GetCustomers.

在Main方法中, 我通过

var filterCustomers = customers.Where(x => x.Id == 2); 

获取了所有id = 2 的customer 对象。

假如现在 where 条件中的 ID 需要从 UI 获取,而且我需要再添加一个 条件,比如url 中包含 jd 字符串如何做呢?

代码可能变成:

            int? inputCustomerId = null;
string inputUrl = null;
var customers = GetCustomers();
//从UI获取值并填充到 inputCustomerId,inputUrl, 这个过程我们省略。
var filterCustomers = customers;
if (inputCustomerId.HasValue) filterCustomers = filterCustomers.Where(x => x.Id == inputCustomerId.Value);
if (!string.IsNullOrEmpty(inputUrl)) filterCustomers = filterCustomers.Where(x => x.Url.Contains(inputUrl));

在上面的代码中有两次过滤,为了避免这个问题,提高性能,我们需要合并这两个where 条件。

首先我们看下where 条件的定义:

 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

  他的参数类型是 Func<TSource, bool>型的,因此我么可以定义一个类型如下,然后进行合并,具体代码如下:

            Func<Customer, bool> idFilter = x => inputCustomerId.HasValue && x.Id == inputCustomerId.Value;
Func<Customer, bool> urlFilter = x => !string.IsNullOrEmpty(inputUrl) && x.Url.Contains(inputUrl);
Func<Customer, bool> filter = x => true && idFilter(x) && urlFilter(x); filterCustomers = customers.Where(filter);

这样处理后,就解决了二次过滤的问题。

linq中如何合并多个predicate条件的更多相关文章

  1. 2.4 LINQ中使用where子句指定筛选条件

    本篇讲解的内容有: 使用where筛选过滤LINQ查询 带逻辑的where筛选 多个where筛选子句 [1.使用where筛选过滤LINQ查询] 通常一个LINQ查询不会如前面的示例代码这么简单,经 ...

  2. LinQ中合并、连接、相交、与非查询

    LinQ中Union合并查询:连接不同的集合,自动过滤相同项:延迟.即是将两个集合进行合并操作,过滤相同的项 var cities = (from p in mylinq.System_Places ...

  3. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  4. linq中的contains条件

    linq中的contains条件   在sql查询语句中,in 在linq 中用contains,并且contains前面是数组,而后面是列名,如: SELECT distinct BH FROM c ...

  5. linq中如何实现多个条件的联合查询

    目前接触处理数据这一块比较多,在处理内存中的数据源的时候我一般使用的是linq,linq使用起来像sql语句一样,用法简单,功能强大. 最近需要实现一个从两个不同的文件读取不同的数据,然后根据这两个数 ...

  6. Linq中关键字的作用及用法

    Linq中关键字的作用及用法 1.All:确定序列中的所有元素是否都满足条件.如果源序列中的每个元素都通过指定谓词中的测试,或者序列为空,则为 true:否则为 false. Demo: 此示例使用 ...

  7. 转载Linq中GroupBy方法的使用总结

    Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等. Linq中的Groupby方法也有这种功能.具体实现看代码: 假设有如下的一个数据集: public class St ...

  8. Linq中join & group join & left join 的用法

    Linq中join & group join & left join 的用法 2013-01-30 11:12 12154人阅读 评论(0) 收藏 举报  分类: C#(14)  文章 ...

  9. 简述Linq中.ToList(), .AsEnumerable(), AsQueryable()的区别和用法

    [TOC] 这3个方法的功能完全不同, 应按照具体业务场景使用. AsQueryable() 先说说什么是 IQueryable IQueryable 是当前的 data provider 返回的类型 ...

随机推荐

  1. 【Flutter学习】页面布局之基础布局组件

    一,概述 Flutter中拥有30多种预定义的布局widget,常用的有Container.Padding.Center.Flex.Row.Colum.ListView.GridView.按照< ...

  2. element-ui弹窗实现自定义宽度

    <el-dialog :title="title" :visible.sync="hiddenDialogCommon" :width="wid ...

  3. php开发面试题---lavarel和tp的区别是什么(呕心整理)

    php开发面试题---lavarel和tp的区别是什么(呕心整理) 一.总结 一句话总结: 反思的回顾非常有用,因为决定了我的方向和技巧 以战养己,这是非常非常好的方式 主要从大小.功能.安全性.操作 ...

  4. Openstack组件部署 — 将一个自定义 Service 添加到 Keystone

    目录 目录 Keystone 认证流程 让 Keystone 为一个新的项目 Service 提供验证功能 最后 Keystone 认证流程 User 使用凭证(username/password) ...

  5. Java中vector用法整理

    ArrayList会比Vector快,他是非同步的,如果设计涉及到多线程,还是用Vector比较好一些 import java.util.*; /** * 演示Vector的使用.包括Vector的创 ...

  6. SQLserver服务无法启动

    今天调整了一下sqlserver tcp/ip 网络协议,重启生效时,SQLserver服务无法启动. 搞了一天都没发现问题,准备重装,发现也比较麻烦.看了日志,网上查了一堆解决方案,均没有. 后台发 ...

  7. js中的关键子in的使用方法

    https://blog.csdn.net/jvid_sky/article/details/54967359

  8. A + B Problem II HDU - 1002

    非常简单的大数加法,因为不会Java只能手写大数加法了;博客存一下以后回来看看 #include<bits/stdc++.h> using namespace std; +; char A ...

  9. ACM 中的对拍程序

    所谓对拍,就是随机生成数据,然后用一个肯定正确的暴力算法的程序,去测试一个要提交的程序. 由于比赛中一般使用 Linux 系统,所以本篇博客的代码都是 Linux 下的程序代码. 其实最简单的方式是写 ...

  10. LOJ #103. 子串查找 (Hash)

    题意 给定两个字符串 \(A\) 和 \(B\),求 \(B\) 在 \(A\) 中的出现次数. 思路 这是一道 \(KMP\) 的模板题. 不过 \(Hash\) 是个好东西,可以用 \(Hash\ ...