zoukankan      html  css  js  c++  java
  • LiteORM学习三:查询设计

    LiteORM学习三:查询设计

    查询
    有趣的部分是查询接口。这是非常简陋,但很有效。有一个工厂方法,查询()返回一个IQuery对象。

    这个对象可以帮助我们定义了SELECT语句的WHERE子句。注意,当我们到一个限制值列我们不使用列的名称。

    记住,ColumnAttribute别名属性这是它派上用场。我们指定的别名,这将是解决实际的列名。

    这样做的好处是我们可以改变,而不需要修改任何查询数据库列的名称。一个例子应该能够更容易理解。语法是非常简陋,但也很相似,实际的SQL语句,所以它应该是相当简单的把握。

    using lite;

    static void Main(string
    [] args)
    {
    IDb db
    = DbFactory.Instance.GetDb();

    // select * from dbo.purchase where id=1
    IQuery q
    = db.Query();
    // note that we are not using the "purchase_id" to reference the column
    // we are using "id" which is the alias for [purchase_id] column (see above)
    q.Constrain("id").Equal(
    1);
    IList list
    = db.Select(typeof(Purchase), q);
    if (list.Count > 0)
    {
    Purchase p
    = (Purchase) list[0];
    ...
    }

    // select * from dbo.purchase where customer=1
    IQuery q1
    = db.Query();
    q1.Constrain("customer").Equal(
    1);
    list
    = db.Select(typeof(Purchase), q1);

    // select * from dbo.purchase where customer=1 and product=2
    IQuery q2
    = db.Query();
    q2.Constrain("customer").Equal(
    1).And()
    .Constrain("product").Equal(
    2);
    list
    = db.Select(typeof(Purchase), q2);

    // select * from dbo.purchase where
    // quantity<=10 and (customer=1 or product=2)
    IQuery q3
    = db.Query().Constrain("customer").Equal(1).Or()
    .Constrain("product").Equal(
    2);
    IQuery q4
    = db.Query().Constrain("quantity").LessEqual(10).And()
    .Constrain(q3);
    list
    = db.Select(typeof(Purchase), q4);

    // select * from dbo.purchase where (customer=1 and product=2)
    // or (quantity>5 and purch_date>=dateadd(day,-10,getdate()))
    IQuery q5
    = db.Query().Constrain("customer").Equal(1).And()
    .Constrain("product").Equal(
    2);
    IQuery q6
    = db.Query().Constrain("quantity").Greater(5).And()
    .Constrain("date").GreaterEqual(
    DateTime.Now.AddDays(-10));
    IQuery q7
    = db.Query().Constrain(q5).Or().Constrain(q6);
    list
    = db.Select(typeof(Purchase), q7);

    // select * from dbo.purchase where comment like '%delivery%'
    list
    = db.Select(typeof(Purchase),
    db.Query().Constrain("comment").
    Like("%delivery%"));

    // select * from dbo.purchase where
    // customer in (1,5,10) order by customer asc
    int[] intarray = new int[] { 1,5,10 };
    // all arrays in .NET implement IList
    IQuery q9
    = db.Query().Constrain("customer").In(intarray)
    .
    Order("customer", true);
    list
    = db.Select(typeof(Purchase), q9);

    // select * from dbo.purchase where product
    // not in (2,3,4) order by purch_date desc
    IList notin
    = new ArrayList();
    notin.
    Add(2);
    notin.
    Add(3);
    notin.
    Add(4);
    IQuery q10
    = db.Query().Constrain("product").NotIn(notin)
    .
    Order("date", false);
    list
    = db.Select(typeof(Purchase), q10);

    // select * from dbo.purchase where quantity
    // is null and purch_date is not null
    IQuery q11
    = db.Query().Constrain("quantity").Equal(null).And()
    .Constrain("date").NotEqual(
    null);
    // .Equal(null) and .NotEqual(null) will convert to SQL's "is null"

    // and "is not null" respectively
    list = db.Select(typeof(Purchase), q11);

    // delete from dbo.purchase where customer=1 and quantity>200
    IQuery q12 = db.Query().Constrain("customer").Equal(1).And()
    .Constrain("quantity").Greater(200);
    list = db.Delete(typeof(Purchase), q12);

    // delete from dbo.purchase
    int deleted = db.Delete(typeof(Purchase), (IQuery)null);

    db.Dispose();
    }

    以上是单个表的查询。

    那么LiteORM怎么解决多表查询呢。对SPResultAttribute 就派上用场了。

    using lite;

    [SPResult]
    public class CustomerPurchase
    {
    [Column] public int Product;
    [Column] public int Quantity;
    [Column] public string Comment;
    [Column(Name="purch_date")] public DateTime PurchaseDate;
    }

    static void Main(string
    [] args)
    {
    using (IDb db
    = DbFactory.Instance.GetDb())
    {
    string procName
    = "dbo.get_customer_purchases";
    object
    [] parameters = new object[] { 1 };
    IList list
    = db.Exec(typeof(CustomerPurchase), procName, parameters);
    foreach (CustomerPurchase cp
    in list)
    {
    Console.WriteLine(string.Format("{
    0}, {1}, {2}, {3}",
    cp.Product, cp.Quantity,
    cp.Comment, cp.PurchaseDate);
    }
    }
    }

    作者:罗敏贵
    邮箱:minguiluo@163.com
    QQ群:34178394 建群 主要是寻找志同道合的人士一起学习和讨论自己的所学所思
    出处:http://luomingui.cnblogs.com/
    说明:专注于微软平台项目架构、熟悉设计模式、架构设计、敏捷个人和项目管理。现主要从事WinForm、ASP.NET、等方面的项目开发、架构、管理工作。文章为作者平时里的思考和练习,可能有不当之处,请博客园的园友们多提宝贵意见。
    知识共享许可协议本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

  • 相关阅读:
    poj 3310(并查集判环,图的连通性,树上最长直径路径标记)
    poj 3308(最小点权覆盖、最小割)
    poj 3281(网络流+拆点)
    poj 3275(传递闭包)
    poj 3204(最小割)
    poj 3164(最小树形图)
    poj 2987(最大权闭合图+割边最少)
    poj 2455(二分+最大流)
    poj 2391(二分+最大流)
    poj 2135(最小费用最大流)
  • 原文地址:https://www.cnblogs.com/luomingui/p/2000813.html
Copyright © 2011-2022 走看看