ServiceStack OrmLite 數據庫查詢 幾個實用方法 (繼承表格式化集合等)


執行SQL語句:

int result = db.SqlScalar<int>("SELECT OBJECT_ID(@name)", new { name = "SomeName" });



繼承表的實現 (存儲於同一個表中)

[Alias("Table")]    
public abstract class MyBaseClass
{
    public String Name { get; set; }
    public String Name1 { get; set; }
    public String Name2 { get; set; }
}

[Alias("Table")]    
public class MyDerivedClassA : MyBaseClass {}

[Alias("Table")]    
public class MyDerivedClassB : MyBaseClass {}



格式化查詢:

     

   db.SelectFmt<Person>("Age > {0}", 40);
     Assert.That(db.GetLastSql(), Is.EqualTo("SELECT \"Id\", \"FirstName\", \"LastName\", \"Age\" FROM \"Person\" WHERE Age > 40"));
     
     db.SelectFmt<Person>("SELECT * FROM Person WHERE Age > {0}", 40);
     Assert.That(db.GetLastSql(), Is.EqualTo("SELECT * FROM Person WHERE Age > 40"));


這兩種方法是等效的,還可以通過拼接字符串的方法,構造出複雜的查詢條件,第一個參數中可以加多個項{0} {1} {2}



返回指定字段的列表:

     

      db.Lookup<int, string>(db.From<Person>().Select(x => new { x.Age, x.LastName }).Where(q => q.Age < 50));
      Assert.That(db.GetLastSql(), Is.EqualTo("SELECT \"Age\",\"LastName\" \nFROM \"Person\"\nWHERE (\"Age\" < 50)"));
      
      db.Lookup<int, string>("SELECT Age, LastName FROM Person WHERE Age < @age", new { age = 50 });
      Assert.That(db.GetLastSql(), Is.EqualTo("SELECT Age, LastName FROM Person WHERE Age < @age"));
      
      db.LookupFmt<int, string>("SELECT Age, LastName FROM Person WHERE Age < {0}", 50);
      Assert.That(db.GetLastSql(), Is.EqualTo("SELECT Age, LastName FROM Person WHERE Age < 50"));


兩種方式等效,可以使用類指定字段名,也可以字符串中指定


局部更新UpdateOnly

更新表中的部分字段是一個很常用的情形, SS提供有一個方法實現這個功能, 叫做 UpdateOnly.

 UpdateOnly 表達式中第二個參數用於指定哪個字段被修改:

db.UpdateOnly(new Person { FirstName = "JJ" }, p => p.FirstName);

UPDATE "Person" SET "FirstName" = 'JJ'

db.UpdateOnly(new Person { FirstName = "JJ", Age = 12 }, 
    onlyFields: p => new { p.FirstName, p.Age });

UPDATE "Person" SET "FirstName" = 'JJ', "Age" = 12

第三個表達式可以指定where子句:

db.UpdateOnly(new Person { FirstName = "JJ" }, 
    onlyFields: p => p.FirstName, 
    where: p => p.LastName == "Hendrix");

UPDATE "Person" SET "FirstName" = 'JJ' WHERE ("LastName" = 'Hendrix')

如果不使用表達式過濾器,也可以使用  ExpressionVisitor 構造器,當你想程序化構造更新表達式時,可以更加靈活:

db.UpdateOnly(new Person { FirstName = "JJ", LastName = "Hendo" }, 
  onlyFields: q => q.Update(p => p.FirstName));

UPDATE "Person" SET "FirstName" = 'JJ'

db.UpdateOnly(new Person { FirstName = "JJ" }, 
  onlyFields: q => q.Update(p => p.FirstName).Where(x => x.FirstName == "Jimi"));

UPDATE "Person" SET "FirstName" = 'JJ' WHERE ("LastName" = 'Hendrix')

如果你想使用無限自由的不確定類型模式,基於字符串的表達式,使用 .Params()擴展方法對參數轉義 (inspired by massive):

db.Update<Person>(set: "FirstName = {0}".Params("JJ"), 
                where: "LastName = {0}".Params("Hendrix"));

甚至表名可以是一個字符串, 這樣你就可以指定和上面功能相同的 update 操作徹底不需要使用Person模型:

db.Update(table: "Person", set: "FirstName = {0}".Params("JJ"), 
          where: "LastName = {0}".Params("Hendrix"));

UPDATE "Person" SET FirstName = 'JJ' WHERE LastName = 'Hendrix'




查詢並且生成集合:


1 直接返回字典類型結果

Dictionary<int, string> trackIdNamesMap = db.Dictionary<int, string>(
    "select Id, Name from Track")

結構是字典類型,其中的Key來自於數據表的Id字段,value來自於數據表的Name字段,其中的Key也可以使用string類型的字段。value也可以使用其他類型字段。



2 直接返回字典類型結果 , 並且將結果分組

Lookup returns an Dictionary<K, List<V>> made from the first two columns:
Dictionary<int, List<string>> albumTrackNames = db.Lookup<int, string>(
    "select AlbumId, Name from Track")


結果是字典類型,其中的鍵是來自數據表的AlbumId字段,value是一個列表,這個類別是根據前邊的AlbumId字段進行分組的,每個鍵值下有數目不等的Name的列表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章