我有Master和Detail類:
class Master
{
public int ID { get; set; }
public string Name { get; set; }
public List<Detail> Details { get; set; }
}
class Detail
{
public Description { get; set; }
public Amount { get; set; }
}
我使用以下方法并且現在作業正常。
List<Master> result = new List<Master>();
// SQL Connection
string sqlCommand = "SELECT * FROM Master LEFT JOIN Detail on Master.ID = Detail.ID";
using (System.Data.SqlClient.SqlDataReader dr = db.DbDataReader as System.Data.SqlClient.SqlDataReader)
{
if (dr.HasRows)
{
Master LastMaster = null;
while (dr.Read())
{
if (LastMaster == null || Convert.ToInt(dr["ID"]) != LastMaster.ID)
{
Master h = new Master();
h.ID = Convert.ToInt(dr["ID"]);
h.Name = Convert.ToString(dr["Name"]);
result.Add(h);
LastMaster = h;
}
if (dr["Description"] == DBNull.Value)
continue;
if (h.Detail == null)
h.Detail = new List<Detail>();
Detail d = new Detail();
d.Description = dr["Description"] as string;
d.Amount = Convert.ToDouble(dr["Amount"]);
LastMaster.Detail.Add(d);
......
}
}
.....
}
有沒有更好的方法來填充 C# 中的串列物件串列?我很感激任何建議。謝謝。
uj5u.com熱心網友回復:
您可以在您的場景中使用 Dapper(一個微型 ORM)。下面是一個示例代碼
const string createSql = @"
create table #Users (Id int, Name varchar(20))
create table #Posts (Id int, OwnerId int, Content varchar(20))
insert #Users values(99, 'Sam')
insert #Users values(2, 'I am')
insert #Posts values(1, 99, 'Sams Post1')
insert #Posts values(2, 99, 'Sams Post2')
insert #Posts values(3, null, 'no ones post')";
using(var connection = new SqlConnection("database connection string"))
{
connection.Execute(createSql);
try
{
const string sql =@"select * from #Posts p
left join #Users u on u.Id = p.OwnerId
Order by p.Id";
var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post; }).ToList();
}
catch(Exception ex){}
}
uj5u.com熱心網友回復:
Ibram 評論了 EF 和 Dapper,Abu 為 Dapper 提供了一個示例(但我不確定它是否演示了使用單個母版和每個母版的多個細節生成圖形的演示,如您所見 - 如果您想探索它,dapper 可以這樣做)
在 EF 中,我們可以執行以下操作:
- 安裝 EF core power tools - 因為你已經有一個 db,我們將使用它來生成類。這個操作只能用命令列完成,但是EFCPT讓很多操作變得更容易
- 右鍵單擊您的專案,選擇 EF Core Power Tools .. 逆向工程師
- 填寫新的連接字串詳細資訊
- 選擇你想變成類的資料庫物件
- 適當地設定其他選項(您可以稍后找到更多關于它們的資訊,如果您的資料庫表類似于 Orders、Customers、Company 并且您希望您的類稱為 Order/Customer/Company(類不應該有復數名稱。現在勾選“將連接字串放入代碼中”-您可以稍后將其洗掉到組態檔中
- 結束。最終,您將獲得一些類和一個背景關系,該背景關系在 OnModelCreating 中有大量代碼,這些代碼對表、列、鍵、關系中的所有內容進行了描述。
現在您可以運行一些查詢,例如:
var c = new YourContext();
var ms = c.Masters.Include(m => m.Details).ToList();
這基本上等同于您發布的內容
您可以通過塑造更復雜的 linq 查詢來獲得更多技巧:
var q = c.Masters.Include(m => m.Details)
.Where(m => m.Name.StartsWith("Smith"))
.OrderBy(m => m.Name);
var ms = q.ToList();
它會被翻譯成類似的東西
SELECT * FROM master join detail on ...
WHERE name LIKE 'Smith%'
ORDER BY m.name
如果您檢查的DebugView屬性,您可以看到生成的查詢q
您可以進行更改:
ms[0].Details.Clear(); //causes delete of all details for this master
ms[1].Details.Add(new Detail { someprop = some value}); //causes insert of new details for this master
ms[2].Name = "Hello"; //causes update of this master name
c.SaveChanges(); //carries out the above, in sql, to affect the db
當您操作回傳的物件并保存時,EF 將根據需要洗掉/插入/更新以將資料庫同步到物件發生的情況。重要的是您要了解 EF 跟蹤它創建的所有物件發生的情況,以便它可以執行此操作
您什么時候會使用 EF,什么時候會使用 Dapper?嗯,它不一定是相互排斥的。您可以在同一個專案中使用它們。一般來說,我會說使用 EF(或其他一些類似的 ORM - nHibernate 是另一個流行的,它的作業原理類似將 linq 運算式轉換為 sql 并將資料跟蹤回物件)用于 sql 如此簡單的東西不必撰寫、跟蹤和寫回更改,從而提高了生產力。它不打算用于形成不能很好地映射到客戶端物件的臨時查詢。為此,您可以使用 Dapper,或者您可以形成客戶端物件并將它們添加到 EF 的模型中,然后運行填充它們的原始 sql。Dapper 很快,因為它不做任何跟蹤更改、映射或連接復雜物件圖的作業;您可以手動完成所有操作。Dapper 對原始 sql 進行了方便的抽象并創建了類,但 EF 走得更遠;它是有代價的 - EF 非常方便,但重量更重。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/340983.html
標籤:C# 数组 sql-server 列表 目的
上一篇:TypeError:'NoneType'物件不可下標,Python
下一篇:蟒蛇|獲取二維串列的第一個元素
