c# - 将相关数据转换为列表
问题描述
我目前正在使用 SQL 管理工作室在 windows 窗体 c# 应用程序中工作,我有两个表
+-------------------------------+
| Category |
+-------------------------------+
| CategoryId (UNIQUEIDENTIFIER) |
| Name (VARCHAR(255)) |
| CreatedBy(VARCHAR(255)) |
| CreationDate(DATETIME) |
+-------------------------------+
+-----------------------------+
| Product |
+-----------------------------+
| ProductId(UNIQUEIDENTIFIER) |
| CategoryId (FK) |
| Name(VARCHAR(255)) |
| CreatedBy(VARCHAR(255)) |
| CreationDate(DATETIME) |
| IsDeleted(BIT) |
+-----------------------------+
在 c# 中,我从数据表中获取数据:
var data = db.GetTableBySQL("usp_RedMarks_Get");
我想将此数据表转换为列表以获取每个类别中的产品列表,如下所示:
private List<Category> GetData()
{
// Simulate a database...
Category c1 = new Category("Fruit", new List<string>() { "Banana", "Apple" });
Category c2 = new Category("Vegetables", new List<string>() { "Avocado", "Tomato" });
Category c3 = new Category("Programming Languages", new List<string>() { "C#", "Visual Basic" });
Category c4 = new Category("Stars", new List<string>() { "Venus", "Mars" });
List<Category> result = new List<Category>();
result.Add(c1);
result.Add(c2);
result.Add(c3);
result.Add(c4);
return result;
}
}
class Category
{
public string Name;
public List<string> Items;
public Category(string name,List<string> items)
{
this.Name = name;
this.Items = items;
}
}
存储过程:
SELECT C.Name AS 'categoryName', P.Name AS 'productName'
FROM Category AS C
INNER JOIN Product AS P ON C.CategoryId = P.CategoryId
ORDER BY C.Name
我怎样才能做到这一点?问候
解决方案
如果您出于某种原因不想使用实体框架。您可以使用更轻量级且更容易上手的库,例如 Dapper。然后你可以很容易地映射它,如下所示:
var productWithCategories =
conn.Query<Product, Category>(@"
SELECT p.*, c.*
FROM Product p
INNER JOIN Category c ON c.Id = p.CategoryId
", (product, category) => {
category.Products = category.Products ?? new List<Product>();
category.Products.Add(product);
return category;
}).AsQueryable();
使用实体框架是这样的:
public class Product
{
...
public List<Category> Categories {get;set;}
}
public class Category
{
...
public int ProductId {get;set;}
public Product Product {get;set;}
}
public class MyDataContext
{
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
}
using (MyDataContext db = new MyDataContext())
{
var categories = (from p in db.Products
join c in db.Categories
on p.CategoryId equals c.Id
select c).ToList();
string productName = categories.First().Product.Name;
}
推荐阅读
- sql-server - SQL Server SSMS 批量插入访问被拒绝
- java - 我如何通过java代码将单个文件上传到指定项目的指定分支,因为没有合适的api接口
- reactjs - 当在 React 中使用 Lazy 时,Webpack 会执行 Tree Shaking 吗?
- go - Glide 或 dep 依赖问题,供应商中的依赖不平坦
- android - ImageView 未显示在 android 中使用相机捕获的图像
- python - 将给定的节点链(链表)分成两半,返回另一半
- reactjs - React firestoreConnect 限制更新频率
- azure - 如果 Azure Function 处理消息失败,是否可以将 Azure Event Hub 配置为保留消息?
- css - 视频标签对象适合替代方案
- java - 区分 Rest API 中的保存和提交