Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于填充包含其他列表的模型的Linq表达式<;T>;_C#_Linq - Fatal编程技术网

C# 用于填充包含其他列表的模型的Linq表达式<;T>;

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 {

我有一个模型(下面的示例),以及具有所需输出的示例数据。。 我也给出了两种填充模型的方法,这两种方法将给出所需的输出,但出于某种原因, 看来我错过了什么

无法弄清楚这里的问题是什么

在纠正方法1或方法2时需要输入信息,或者您也可以建议任何其他有助于在以下响应中填充模型的方法

模型

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;
    }