连接到数据库后,我可以获取在我的所有列中返回的列的名称SqlDataReader吗?
我正在尝试实现一个返回迭代器的异步函数.这个想法如下:
private async Task<IEnumerable<char>> TestAsync(string testString)
{
foreach (char c in testString.ToCharArray())
{
// do other work
yield return c;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,有一个错误消息,该函数不能是迭代器块,因为Task<IEnumerable<char>>它不是迭代器接口类型.有解决方案吗?
我将尽力以最好的方式解释我的情景.我的数据库中有以下表格:
Products{ProductId, CategoryId ...}
Categories{CategoryId ...}
CategoryProperties{CategoryPropertyId, CategoryId, Name ...}
PropertyValues{ProductId, CategoryPropertyId, Value ...}
Run Code Online (Sandbox Code Playgroud)
因此,目标是拥有属于某个类别的产品列表,每个类别可以在"PropertyValues"表中包含具有值的"n"个属性.我有一个基于'categoryId'返回数据的查询,所以我总能从数据库中得到不同的结果:
对于CPU类别:
intel i7 | CPU | Model | Socket | L1 Cash | L2 Cahs | etc.
Run Code Online (Sandbox Code Playgroud)
对于HDD类别:
samsung F3 | HDD | Model | Speed | GB | etc.
Run Code Online (Sandbox Code Playgroud)
因此,根据我的查询中的类别,我总是可以得到不同的列号和名称.对于数据库访问,我使用简单的ADO.NET调用返回结果的存储过程.但是因为查询结果本质上是动态的,所以我不知道读取这些数据的好方法是什么.
我做了一个Product实体,但我很困惑如何使其真正:(
我认为我可以做一个Product实体,使该其他实体继承 Product一样Cpu,Hdd,Camera,PcCase,GraphicCard,MobilePhone,Gps等
,但我认为这是愚蠢的,因为我可以结束这与域中有200多个实体.
在这种情况下你会做什么?
如何阅读和放置这个动态属性?
更新 …
我的属性绑定数据访问类有一个小问题(更像是一个烦恼)。问题是当读取器中不存在类中相应属性的列时,映射会失败。
这是映射器类:
// Map our datareader object to a strongly typed list
private static IList<T> Map<T>(DbDataReader dr) where T : new()
{
try
{
// initialize our returnable list
List<T> list = new List<T>();
// fire up the lamda mapping
var converter = new Converter<T>();
while (dr.Read())
{
// read in each row, and properly map it to our T object
var obj = converter.CreateItemFromRow(dr);
// add it to our list
list.Add(obj);
}
// reutrn it
return list;
} …Run Code Online (Sandbox Code Playgroud) c# reflection expression-trees dbdatareader linq-expressions