日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# NPOCO 轻量级ORM框架(进阶)

發布時間:2025/7/14 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# NPOCO 轻量级ORM框架(进阶) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

繼續翻譯NPOCO wiki。

這篇將home上 下面的幾個頁面翻譯。

wiki地址:https://github.com/schotime/NPoco/wiki

上一篇: http://www.cnblogs.com/Aaxuan/p/7366476.html

?

?

從數據庫映射到現在有對象

?

使用 SingleInto、SingleOrDefaultInto、FirstInto 和 FirstOrDefaultInto 方法,可以將數據庫的列映射到現有對象。只有查詢中的列將被設置在現有對象上。

1 public class User 2 { 3 public int UserId { get;set; } 4 public string Email { get;set; } 5 } 6 7 var user = new User() { UserId = 1 }; 8 IDatabase db = new Database("connStringName"); 9 db.SingleOrDefaultInto(user, "select Email from users where userid = @0", 1);

?

一對多的查詢

?

這幫助您映射一個與嵌套列表對象有一對多關系的查詢。鑒于以下類:

1 public class UserDto 2 { 3 public int UserId { get; set; } 4 public string Name { get; set; } 5 public List<CarDto> Cars { get; set; } 6 } 7 8 public class CarDto 9 { 10 public string Make { get; set; } 11 public string Color { get; set; } 12 }

查詢:

1 IDatabase db = new Database("connStringName"); 2 3 //v2 4 var users = db.FetchOneToMany<UserDto, CarDto>(x => x.UserId, 5 "select u.*, c.* from Users u inner join Cars c on u.UserId = c.UserId order by u.UserId"); 6 7 //v3 8 var users = db.FetchOneToMany<UserDto>(x => x.Cars, 9 "select u.*, c.* from Users u inner join Cars c on u.UserId = c.UserId order by u.UserId");

這將為您提供一個UserDto對象的列表,并且對于每個對象,也將填充CarDto的列表。

注意:

  • 此方法的第一個參數是 lambda 表達式,該表達式標識第一個對象的惟一屬性。
  • 列的順序非常重要。它必須與定義的泛型參數的順序一致。在這個示例中,查詢指定了u。然后c * 映射到< UserDto,CarDto >。
  • 如果您要映射到用于插入數據的對象,那么你需要確定你對 List<> 使用了 [Ignore] 屬性。
  • 如果您正在使用一個外連接來執行查詢,并且您預期其中的一些將不會被填充,請確保在 FetchOneToMany 調用中使用第二個lambda。這將返回許多對象的主要屬性。在上面的例子中,這可能是x = > x . carid。
  • FetchOneToMany 不能用于獲取嵌套的一對多關系,也不能用于多個一對多關系。例如,如果UserDto也有一個BoatsDto列表,那么只有CarDto列表或BoatsDto列表可以加載并映射到一個查詢。
  • 對嵌套對象映射

    ?

    這將幫助您將查詢映射到有嵌套對象的對象。鑒于以下類:

    1 public class User 2 { 3 public int UserId { get; set; } 4 public string Name { get; set; } 5 public Address Address { get; set; } 6 } 7 8 public class Address 9 { 10 public string Street { get; set; } 11 public string City { get; set; } 12 }

    查詢:

    1 IDatabase db = new Database("connStringName"); 2 var users = db.Fetch<User, Address>("select u.UserId, u.Name, u.Street, u.City from Users");

    這將給您一個使用嵌套類映射的 user 對象列表。

    注意:

  • 列的順序非常重要。查詢中的列需要按照指定的泛型參數的順序指定。如。首先指定用戶列,然后指定地址列。
  • 如果您要映射到用于插入數據的對象,那么您需要確保使用 [ResultColumn] 屬性忽略地址類。從v3中,您還需要添加[ComplexMapping]s屬性。
  • ?

    字典和對象數組查詢

    ?

    有時,您不知道查詢返回的列。這就是能夠映射到字典< string,object >,或object[]的地方。字典和對象數組查詢。

    1 var users = db.Fetch<Dictionary<string, object>>("select * from users"); 2 3 or 4 5 var users = db.Fetch<object[]>("select * from users");

    注意:

    從NPoco版本 > 1.0.3 開始,所有數組類型(值類型。string[]、int[]、double[]、DateTime[]等)將是一個有效的通用參數。

    ?

    跟蹤更改的更新

    ?

    使用快照

    快照用于跟蹤實體的更改,因此只有更改的屬性才會被更新。在下面的示例中,只有新 Name 將被發送到數據庫,因為它的年齡值與啟動快照時的值相同。

    1 IDatabase db = new Database("connString"); 2 var user = db.SingleById<User>(1); // Name = "Ted", Age = 21 3 4 var snapshot = db.StartSnapshot(user); // 在此之后的任何更改都將被記錄。 5 6 user.Name = "Bobby"; 7 user.Age = 21; 8 9 db.Update(user, snapshot.UpdatedColumns()); // 只更新Name列

    只有在UpdatedColumns()之前的更改將被包含在變更集中。

    ?

    復合主鍵

    ?

    復合鍵可以指定通過放置兩個逗號之間的列名稱 [PrimaryKey] 屬性。

    1 [TableName("Users")] 2 [PrimaryKey("UserId,UserName")] 3 public class User 4 { 5 public int UserId { get; set; } 6 public string UserName { get;set; } 7 }

    當設置了復合鍵,AutoIncrement屬性總是默認false。

    如果你想使用 SingleById 方法查找一個對象,就可以使用匿名類型。

    1 IDatabase db = new Database("connStringName"); 2 var user = db.SingleById<User>(new {UserId = 1, UserName = "user"});

    ?

    多個結果集

    ?

    該特性使您能夠在只調用一次數據庫的情況下映射多個查詢。

    FetchMultiple 方法返回一個? Tuple < T >,List < T1 > >。

    1 IDatabase db = new Database("connStringName"); 2 Tuple<List<User>, List<Address>> data = db.FetchMultiple<User, Address>("select * from users;select * from addresses;"); 3 var users = data.Item1; 4 var addresses = data.Item2;

    支持:

    這僅支持可以返回多個結果集的數據庫。在IDataReader上實現了NextResult()。通過Npgsql支持Sql Server和Postgresql。

    ?

    流利的映射

    ?

    對于一個類的映射,您可以使用 Map < T > 繼承,其中 T 是要映射的類。

    1 public class UserMapping : Map<User> 2 { 3 public UserMapping() 4 { 5 PrimaryKey(x => x.UserId); 6 TableName("Users"); 7 Columns(x => 8 { 9 x.Column(y => y.Name).Ignore(); 10 x.Column(y => y.Age).WithName("a_ge"); 11 }); 12 } 13 }

    映射也可以從映射繼承,并使用For < >方法在一次類中指定所有的映射。

    1 public class OurMappings : Mappings 2 { 3 public OurMappings() 4 { 5 For<User>().Columns( .... 6 } 7 }

    ?

    數據庫工廠設置:

    ?

    您只需要創建映射一次,我們使用數據庫工廠來完成此操作。

    1 public void Application_Start() 2 { 3 MyFactory.Setup(); 4 }

    ?

    1 public static class MyFactory 2 { 3 public static DatabaseFactory DbFactory { get; set; } 4 5 public static void Setup() 6 { 7 var fluentConfig = FluentMappingConfiguration.Configure(new OurMappings()); 8 //或單個的映射
    9
    //var fluentConfig = FluentMappingConfiguration.Configure(new UserMapping(), ....); 10 11 DbFactory = DatabaseFactory.Config(x => 12 { 13 x.UsingDatabase(() => new Database("connString")); 14 x.WithFluentConfig(fluentConfig); 15 x.WithMapper(new Mapper()); 16 }); 17 } 18 }

    然后你可以在你的代碼中使用它。

    1 var database = MyFactory.DbFactory.GetDatabase();

    如果你使用的是容器,那么你可以使用類似的東西

    1 For<IDatabase>().Use(() => MyFactory.DbFactory.GetDatabase());

    ?

    簡單LINQ查詢

    ?

    Query<T>

    NPoco介紹了一種使用LINQ查詢獲取對象的簡單方法。這里有一個簡單的例子。

    1 IDatabase db = new Database("connString"); 2 db.Query<User>().Where(x => x.Name == "Bob") 3 .OrderBy(x => x.UserId) 4 .Limit(10, 10) 5 .ToList();

    可用的LINQ關鍵字:

    • ProjectTo
    • Count
    • Any
    • Where
    • OrderBy
    • OrderByDescending
    • ThenBy
    • ThenByDescending
    • Limit
    • Include
    • IncludeMany

    這里是你如何使用一個IN子句:

    1 var users = db.Query<User>().Where(x => new[] {1,2,3,4}.Contains(x.UserId)).ToList(); 2 // 或者使用 'In' 擴展方法 3 var users = db.Query<User>().Where(x => x.UserId.In(new[] {1,2,3,4})).ToList();

    在where子句中也可以使用許多字符串方法。這里有幾個例子:

    1 var users = db.Query<User>().Where(x => x.Name.StartsWith("Bo")).ToList(); 2 var users = db.Query<User>().Where(x => x.Name.EndsWith("ob")).ToList(); 3 var users = db.Query<User>().Where(x => x.Name.Contains("o")).ToList(); 4 var users = db.Query<User>().Where(x => x.Name.ToLower() == "bob").ToList(); 5 var users = db.Query<User>().Where(x => x.Name.ToUpper() == "BOB").ToList();

    注意:并不是所有的操作都已經實現了。

    ?

    查詢提供

    ?

    Query<T>

    查找用戶id大于50的所有用戶,按名稱排序,只返回20個記錄。

    1 var users = db.Query<User>() 2 .Where(x => x.UserId > 50) 3 .OrderBy(x => x.Name) 4 .Limit(20, 40) 5 .ToList();

    注意:

    查詢將只在ToList()、ToEnumerable()或返回1值的標量方法中運行。

    ?

    UpdateMany<T>

    在必要的情況下,使用 Where 更新所有類型T 。

    var list = new[] {1, 2, 3, 4}; // 只更新模板傳遞的(1、2、3、4)中 UserId 對象的 Name字段 // 如果使用 ExecuteDefaults 方法,則不會設置默認屬性 null,或為0的int db.UpdateMany<User>().Where( x => x.UserId.In(list))//.ExcludeDefaults().OnlyFields(x => x.Name).Execute(new User() {Name = "test"});

    注意:

    查詢只在執行調用時運行。

    ?

    DeleteMany<T>

    在必要的情況下,使用 Where 刪除所有類型T 。

    1 var list = new[] {1, 2, 3, 4}; 2 3 db.DeleteMany<User>() 4 .Where(x => list.Contains(x.UserId)) 5 .Execute();

    注意:

    查詢只在執行調用時運行。

    ?

    版本列支持

    ?

    [VersionColumn]

    一個數字字段可以用來檢測相互沖突的更新:

    1 [TableName("Users")] 2 [PrimaryKey("UserId")] 3 public class User 4 { 5 public int UserId { get;set; } 6 7 [VersionColumn("VersionInt", VersionColumnType.Number)] 8 public long VersionInt { get; set; } 9 }

    更新將自動檢查和增加版本,如果它已經過時,就會拋出 DBConcurrencyException 異常。

    這可以通過設置來禁用:VersionException = VersionExceptionHandling.Ignore。

    ?

    在SQL Server中,rowversion timestamp 數據類型

    可用于與VersionColumnType.RowVersion版本列:

    1 [TableName("Users")] 2 [PrimaryKey("UserId")] 3 public class User 4 { 5 public int UserId { get;set; } 6 7 [VersionColumn("Version", VersionColumnType.RowVersion)] 8 public byte[] Version { get; set; } 9 }

    ?

    Sql模板

    ?

    您可以使用SqlBuilder在有條件的地方建立查詢,例如,列,orderby等。

    1 var sqlBuilder = new SqlBuilder(); 2 var template = sqlBuilder.AddTemplate("select * from users where age > @0 and /**where**/", 10);

    這里你可以指定一個 Where、Select、Join、LeftJoin、OrderBy、OrderByCols、GroupBy 和 Having 相應的sql令牌在下面指定。

    1 /// Adds a filter. The Where keyword still needs to be specified. Uses /**where**/ 2 public SqlBuilder Where(string sql, params object[] parameters) 3 4 /// Replaces the Select columns. Uses /**select**/ 5 public SqlBuilder Select(params string[] columns) 6 7 /// Adds an Inner Join. Uses /**join**/ 8 public SqlBuilder Join(string sql, params object[] parameters) 9 10 /// Adds a Left Join. Uses /**leftjoin**/ 11 public SqlBuilder LeftJoin(string sql, params object[] parameters) 12 13 /// Adds an Order By clause. Uses /**orderby**/ 14 public SqlBuilder OrderBy(string sql, params object[] parameters) 15 16 /// Adds columns in the Order By clause. Uses /**orderbycols**/ 17 public SqlBuilder OrderByCols(params string[] columns) 18 19 /// Adds a Group By clause. Uses /**groupby**/ 20 public SqlBuilder GroupBy(string sql, params object[] parameters) 21 22 /// Adds a Having clause. Uses /**having**/ 23 public SqlBuilder Having(string sql, params object[] parameters)

    語句可以被鏈接,并且每個新語句的參數從0開始。

    1 sqlBuilder 2 .Where("height >= @0", 176) 3 .Where("weight > @0 and weight < @1", 30, 60); 4 5 var db = new Database("conn"); 6 db.Fetch<User>(template);

    可以在任何可以使用Sql類的地方使用模板。

    ?

    ?

    ?

    到此為止,wiki 主頁上的文章除了一篇講調試的,還有右側列表中有二,三篇沒有翻譯。

    翻譯過程中挺難受的,英語看的一知半解,代碼也一知半解,經常看完代碼才明白英文意思。。

    不過還好是翻譯的意思都差不多,可能會有理解,翻譯錯誤的地方,有發現的園友還請指出,以便改正。

    ?

    翻譯時間? 2017/8/20

    轉載于:https://www.cnblogs.com/Aaxuan/p/7391094.html

    總結

    以上是生活随笔為你收集整理的C# NPOCO 轻量级ORM框架(进阶)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。