查找在程序开发中是必不可少的,EF为我们提供很多种查找的方式,基本上能够满足各种业务需求,下面我们来讲讲一些常用的过滤条件。
如果字段是int类型,那么我们可以使用 > < == >= <= != 这些操作。比如查找年龄大于18岁的会员:
var query = context.Account.Where(p => p.Age > 18);
如果字段是String类型的,那么就可以使用 = 这种或者Contains,相当于SQL中的like。比如查找名字中含有北字的:
var methodQuery = context.Account.Where(p => p.Name.Contains("北"));
如果是多个条件,可以使用 && || ! 这三个来拼接。比如上面的大于18岁并且名字带北的会员:
var methodQuery = context.Account.Where(p => p.Age > 18 && p.Name.Contains("北"));
如果是bool类型的字段,可以直接使用。比如会员状态是激活的会员:
var methodQuery = context.Account.Where(p => p.IsActive);
// context.Account.ToList();
// context.Account.Where(p => true).ToList();
如果是非激活的,那也很简单:
var methodQuery = context.Account.Where(p => !p.IsActive);
排序,OrderBy和ThenBy。OrderBy和ThenBy的语义是不同的,如:
context.Account.Where(p => p.IsActive).OrderBy(x=>x.Age).OrderBy(x=>x.Email);
// 那么最终只会根据Email进行排序;
list.OrderBy(x=>x.A).ThenBy(x=>x.B);
// 那么最终会先根据A、再根据B进行排序
OrderBy多个的时候,后面的会覆盖前面的,如果需要先某个排序再某个排序,那么就可以使用ThenBy。
获取单一值的时候,有时候我们查找的值可能有多个,这时候EF也提供一些方法给我们来获取一条记录:
| 操作符 | 如果源序列是空的 | 源序列只包含一个元素 | 源序列包含多个元素 |
|---|---|---|---|
| First | 抛异常 | 返回该元素 | 返回第一个元素 |
| FirstOrDefault | 返回default(TSource) | 返回该元素 | 返回第一个元素 |
| Last | 抛异常 | 返回该元素 | 返回最后一个元素 |
| LastOrDefault | 返回default(TSource) | 返回该元素 | 返回最后一个元素 |
| Single | 抛异常 | 返回该元素 | 抛异常 |
| SingleOrDefault | 返回default(TSource) | 返回该元素 | 抛异常 |
上面的Single的方式查找,如果查找出来的记录多余一条的,就会报错。所有的不带Default的只要查找的记录是空的,那么就都会抛出异常,开发者可用根据实际需要,选择使用哪个方法。
我们可以直接将条件传给上面的方法,而不需要Where。例如:
var first = context.Account.First(p => p.Name == "北盟");
以某个字母或者数字开始或者结尾。例如:
m => m.Phone.StartsWith("1")
Find的使用,如果我们知道某条记录的主键ID是多少,那么就可以使用Find方法,直接取得该主键的实体:
var findQuery = context.Account.Find(1);
上面句子,是我们知道了某条记录的主键为1的情况下快速获取。
Previous: 12节-Join的使用
Next: 延迟加载和贪婪加载