复杂查找

查找在程序开发中是必不可少的,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的情况下快速获取。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注