• Linq查询语法之top查询和分页查询
  • 银色镜架 发表于 2015/9/9 12:41:00 | 分类标签: Linq语法 Linq分页 Linq排序
  • 场景:SQLServer中的top查询和分页查询在Linq中该如何实现呢?如果我不想一次取出所有的数据我在Linq中该如何实现呢?

    Take

    说明:获取集合的前n个元素;延迟。即只返回限定数量的结果集。

    var q = (
        from e in db.Employees
        orderby e.HireDate
        select e)
        .Take(5);

    语句描述:选择所雇用的前5个雇员。

    Skip

    说明:跳过集合的前n个元素;延迟。即我们跳过给定的数目返回后面的结果集。

    var q = (
        from p in db.Products
        orderby p.UnitPrice descending
        select p)
        .Skip(10);

    语句描述:选择10种最贵产品之外的所有产品。

    TakeWhile

    说明:直到某一条件成立就停止获取;延迟。即用其条件去依次判断源序列中的元素,返回符合判断条件的元素,该判断操作将在返回false或源序列的末尾结束 。

    SkipWhile

    说明:直到某一条件成立就停止跳过;延迟。即用其条件去判断源序列中的元素并且跳过第一个符合判断条件的元素,一旦判断返回false,接下来将不再进行判断并返回剩下的所有元素。

    Paging(分页)操作

    适用场景:结合Skip和Take就可实现对数据分页操作。

    1.索引

    var q = (
        from c in db.Customers
        orderby c.ContactName
        select c)
        .Skip(50)
        .Take(10);

    语句描述:使用Skip和Take运算符进行分页,跳过前50条记录,然后返回接下来10条记录,因此提供显示Products表第6页的数据。

    2.按唯一键排序

    var q = (
        from p in db.Products
        where p.ProductID > 50
        orderby p.ProductID
        select p)
        .Take(10);

    语句描述:使用Where子句和Take运算符进行分页,首先筛选得到仅50 (第5页最后一个ProductID)以上的ProductID,然后按ProductID排序,最后取前10个结果,因此提供Products表第6页的数据。请注意,此方法仅适用于按唯一键排序的情况。  

    SqlMethods操作

    在LINQ to SQL语句中,为我们提供了SqlMethods操作,进一步为我们提供了方便,例如Like方法用于自定义通配表达式,Equals用于相比较是否相等。

    Like

    自定义的通配表达式。%表示零长度或任意长度的字符串;_表示一个字符;[]表示在某范围区间的一个字符;[^]表示不在某范围区间的一个字符。比如查询消费者ID以“C”开头的消费者。 

    var q = from c in db.Customers
            where SqlMethods.Like(c.CustomerID, "C%")
            select c;

    比如查询消费者ID没有“AXOXT”形式的消费者:

    var q = from c in db.Customers
            where !SqlMethods.Like(c.CustomerID, "A_O_T")
            select c;

    DateDiffDay

    说明:在两个变量之间比较。分别有:DateDiffDay、DateDiffHour、DateDiffMillisecond、DateDiffMinute、DateDiffMonth、DateDiffSecond、DateDiffYear 

    var q = from o in db.Orders
            where SqlMethods
            .DateDiffDay(o.OrderDate, o.ShippedDate) < 10
            select o;

    语句描述:查询在创建订单后的 10 天内已发货的所有订单。

    已编译查询操作(Compiled Query)

    说明:在之前我们没有好的方法对写出的SQL语句进行编辑重新查询,现在我们可以这样做,看下面一个例子:

    //1.创建compiled query
    NorthwindDataContext db = new NorthwindDataContext();
    var fn = CompiledQuery.Compile(
        (NorthwindDataContext db2, string city) =>
        from c in db2.Customers
        where c.City == city
        select c);
    //2.查询城市为London的消费者,用LonCusts集合表示,这时可以用数据控件绑定
    var LonCusts = fn(db, "London");
    //3.查询城市为Seattle的消费者
    var SeaCusts = fn(db, "Seattle");

    语句描述:这个例子创建一个已编译查询,然后使用它检索输入城市的客户。

  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:银色镜架
  • 加入时间:2013/7/30 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮