C# 用于填充包含其他列表的模型的Linq表达式<;T>;
我有一个模型(下面的示例),以及具有所需输出的示例数据。。 我也给出了两种填充模型的方法,这两种方法将给出所需的输出,但出于某种原因, 看来我错过了什么 无法弄清楚这里的问题是什么 在纠正方法1或方法2时需要输入信息,或者您也可以建议任何其他有助于在以下响应中填充模型的方法 模型C# 用于填充包含其他列表的模型的Linq表达式<;T>;,c#,linq,C#,Linq,我有一个模型(下面的示例),以及具有所需输出的示例数据。。 我也给出了两种填充模型的方法,这两种方法将给出所需的输出,但出于某种原因, 看来我错过了什么 无法弄清楚这里的问题是什么 在纠正方法1或方法2时需要输入信息,或者您也可以建议任何其他有助于在以下响应中填充模型的方法 模型 class Emp { public int id {get;set;} public int Name {get;set;} public List<cardType> cardTypes {
class Emp
{
public int id {get;set;}
public int Name {get;set;}
public List<cardType> cardTypes {get;set;}
}
class cardType
{
public int name {get;set;}
public DateTime Expiry {get;set;}
}
sample data (Data is returned in 1 table only)
id Name cardTypeName exp
1 a Amex 1010
1 a City 2010
desired output
<Emp>
<ID>1</id>
<name>1</name>
<cardTypes>
<cardType>
<Name> Amex </Name>
<exp> 1010 </exp>
</cardType>
<cardType>
<Name> City </Name>
<exp> 2010 </exp>
</cardType>
<cardTypes>
</Emp>
方法2
return (from DataRow dr in dataTable.Rows
select new Emp
{
id = "",
name= "",
cardTypes = dataTable.AsEnumerable()
.Select(x => new cardType
{
name = ""
exp = ""
}).ToList(),
});
试试这个
return dataTable.AsEnumerable()
.GroupBy(x => x.Id)
.Select(x => new
{
id = x.Key,
name = x.Key,
cardTypes = x.Select(t => new
{
name = t.Name,
exp = t.Exp
})
});
考虑到您将把
cardType
中的expiration
字段更改为int
var results =
dt.AsEnumerable()
.GroupBy(row => row.ItemArray[0])
.Select(rows => new Emp
{
id = rows.Key,
name = rows.Key,
cardTypes = rows.Select(row => new cardType {Name = row.ItemArray[2], Expiry = row.ItemArray[3]})
});
如果希望使用日期时间
,请决定如何转换。例如:
cardTypes = rows.Select(row => new cardType {Name = row.ItemArray[2], Expiry = new DateTime(row.ItemArray[3],1,1)})
如果要将模型序列化为xml,则应使用
[Serializable]
属性标记模型,并仅使用XmlSerializer
[Serializable]
class Emp
{
public int id {get;set;}
public int Name {get;set;}
public List<cardType> cardTypes {get;set;}
}
[Serializable]
class cardType
{
public int name {get;set;}
public DateTime Expiry {get;set;}
}
[可序列化]
类电磁脉冲
{
公共int id{get;set;}
公共int名称{get;set;}
公共列表卡片类型{get;set;}
}
[可序列化]
类别卡片类型
{
公共int名称{get;set;}
公共日期时间到期{get;set;}
}
之后,您可以使用以下代码:
static Dictionary<int, Emp> ConvertToDict(DataTable dt)
{
Dictionary<int, Emp> emps = new Dictionary<int, Emp>();
foreach (var dr in dt.AsEnumerable())
{
var id = (int)dr["ID"];
var name = (string)dr["Name"];
var cardTypeName = (string)dr["CardTypeName"];
var exp = (int)dr["Exp"];
Emp emp;
var cardType = new CardType { Name = cardTypeName, Exp = exp };
if (emps.TryGetValue(id, out emp))
{
emp.CardTypes.Add(cardType);
}
else
{
emps.Add(id, new Emp { ID = id, Name = name, CardTypes = new List<CardType> { cardType } });
}
}
return emps;
}
static List<string> Serialize<T>(IEnumerable<T> entities) where T:new()
{
var ser = new XmlSerializer(typeof(T));
var serializedEntities = entities.Select(entity =>
{
using (var sw = new StringWriter())
{
ser.Serialize(sw, entity);
return sw.ToString();
}
}).ToList();
return serializedEntities;
}
静态字典转换器(数据表dt)
{
字典emps=新字典();
foreach(dt.AsEnumerable()中的var dr)
{
变量id=(int)dr[“id”];
变量名称=(字符串)dr[“name”];
var cardTypeName=(字符串)dr[“cardTypeName”];
var exp=(int)dr[“exp”];
Emp-Emp;
var cardType=new cardType{Name=cardTypeName,Exp=Exp};
if(emps.TryGetValue(id,out emp))
{
emp.CardTypes.Add(cardType);
}
其他的
{
添加(id,新Emp{id=id,Name=Name,CardTypes=newlist{cardType});
}
}
返回EMP;
}
静态列表序列化(IEnumerable实体),其中T:new()
{
var ser=新的XmlSerializer(typeof(T));
var serializedenties=实体。选择(实体=>
{
使用(var sw=new StringWriter())
{
序列序列化(软件、实体);
返回sw.ToString();
}
}).ToList();
返回身份;
}
我相信,在这两种情况下,您在外部表达式中都缺少一个.ToList()。@ChrisDixon,因为我的外层不是List类型。。。所以我没有把.ToList()放进去,我也试过检查一下这是否是个问题。。。但是没有luckDo,您需要以xml形式输出,还是只想将数据输入到模型中?您的到期字段是DateTime,但实际数据只包含年份。也许换成int?如果不是,那么2010年是什么日期?01/01/2010 ? 2010年12月31日?@OfirWinegarten-我必须填充模型。。。xml只是我给出的一个示例。如果我使用确切的类型,即,而不是var,并且如果我使用Emp,它会给出错误。。如果我把返回类型改为IEnumerable。。。它是有效的。。。但这不是我们需要的。。。。我需要返回类型仅为Emp。。私人Emp GetEmp(数据表dt)我现在得到了。。。将.Select更改为SingleOrDefault并删除了x=>因为只需要一次emp信息。。。如果我使用确切的类型,即,而不是var,并且如果我使用Emp,则能够将类型返回为Emp,这会给出错误。。如果我把返回类型改为IEnumerable。。。它是有效的。。。但这不是我们需要的。。。。我需要返回类型仅为Emp。。私人Emp GetEmp(数据表dt)现在得到了。。。将.Select更改为SingleOrDefault并删除了x=>因为只需要一次emp信息。。。并且能够将类型返回为EMP。。。正在测试。。。
static Dictionary<int, Emp> ConvertToDict(DataTable dt)
{
Dictionary<int, Emp> emps = new Dictionary<int, Emp>();
foreach (var dr in dt.AsEnumerable())
{
var id = (int)dr["ID"];
var name = (string)dr["Name"];
var cardTypeName = (string)dr["CardTypeName"];
var exp = (int)dr["Exp"];
Emp emp;
var cardType = new CardType { Name = cardTypeName, Exp = exp };
if (emps.TryGetValue(id, out emp))
{
emp.CardTypes.Add(cardType);
}
else
{
emps.Add(id, new Emp { ID = id, Name = name, CardTypes = new List<CardType> { cardType } });
}
}
return emps;
}
static List<string> Serialize<T>(IEnumerable<T> entities) where T:new()
{
var ser = new XmlSerializer(typeof(T));
var serializedEntities = entities.Select(entity =>
{
using (var sw = new StringWriter())
{
ser.Serialize(sw, entity);
return sw.ToString();
}
}).ToList();
return serializedEntities;
}