我在尝试编写 LINQ 查询来执行以下操作时有点挣扎,
public class MyClass
{
public int ID {get; set;}
public int Name {get; set;}
public IEnumerable<string> SomeIEnumerable {get; set;}
}
我正在尝试使用 LINQ 从数据库查询创建对象,该查询将返回如下内容,
ID Name SomeString
0 NameA "MyValue"
1 NameB "Value1"
1 NameB "Value2"
2 NameC "Value"
LINQ 也很容易编写,
from DataRow row in dataSet.Tables[0].Rows
select new MyClass
{
ID = (int)row["ID"],
Name = row["Name"].ToString(),
SomeIEnumerable = new List<string>{ row["SomeString"].ToString() }
};
棘手的部分是如何将其转换为字典,其中字典[1]。SomeIEnumerable = {"Value1", "Value2"}
一个简单的ToDictionary会抛出一个ArgumentException
这里的主要问题是,我如何处理键不明显的事实,并能够在临时字典中查找现有值以向其添加我感兴趣的值。
您还可以进行分组,然后使用 IGrouping 检索组中的项目列表
示例代码
var simulatedData = Enumerable.Range(0,10).Select(x=> new {Key=x%3+1, Index=x});
var dict = simulatedData.GroupBy(x=>x.Key).ToDictionary(x=>x.Key, x=>x.Select(t=>t.Index));
不要调用ToDictionary
,而是调用ToLookup
. :)
感谢@Tilak的回答是,
from DataRow row in dataSet.Tables[0].Rows
group row by new
{
ID = (int) row["ID"],
Name = row["Name].ToString()
} into rowGroup
select new MyClass
{
ID = rowGroup.Key.ID,
Name = rowGroup.Key.Name,
SomeIEnumerable =
from row in rowGroup
select row["SomeString"].ToString()
};