我正在尝试使用数据表中的行填充客户模型

时间:2012-05-31 03:53:52

标签: c# asp.net-mvc ienumerable

我正在尝试使用数据表中的行填充客户模型,但无法正确获取语法。原始代码取自本教程Your First ASP.NET Web API (C#)。

我已经向控制器添加了一个DataTable,但是我无法弄清楚如何将表中的行放入我的客户模型中。我认为我可以用foreach做到这一点,但正如我所说,我无法使语法正确。这就是我所拥有的

    Customer[] customers = new Customer[]
    {
        //new Customer {Id = "123", FirstName = "Buk", LastName = "Hix" }
        // Replace hard coded customer information with foreach loop.

        //commented out because it causes compile warnings
        //foreach (DataRow row in GetAllData().Rows)
        //{
        //    yield return new Customer
        //    {
        //        CustomerId = Convert.ToString(row["CustomerId"]),
        //        FirstName = Convert.ToString(row["FirstName"]),
        //        LastName = Convert.ToString(row["LastName"])
        //    };
        //}
    };

    public IEnumerable<Customer> GetAllCustomers()
    {            
        return customers;
    }  

完成我想要做的事情的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用LINQ:

Customer[] customers = GetAllData()
    .Rows
    .Cast<DataRow>()
    .Select(row => new Customer
    {
        CustomerId = Convert.ToString(row["CustomerId"]),
        FirstName = Convert.ToString(row["FirstName"]),
        LastName = Convert.ToString(row["LastName"])
    })
    .ToArray();

确保您已将System.Linq添加到using指令中,以便将扩展方法纳入范围。

答案 1 :(得分:1)

你很亲密。在创建迭代器(一个返回使用yield的IEnumerable / IEnumerator的函数)时,您只需根据需要将代码放入正文中yield。无需将它们扔进另一个集合中。编译器将为代码生成一个迭代器。

public IEnumerable<Customer> GetAllCustomers()
{
    foreach (DataRow row in GetAllData().Rows)
    {
        yield return new Customer
        {
            CustomerId = row.Field<string>("CustomerId"),
            FirstName = row.Field<string>("FirstName"),
            LastName = row.Field<string>("LastName"),
        };
    }
}

如果你对它开放,那么在这里使用LINQ会更好。

public IEnumerable<Customer> GetAllCustomers()
{
    return
        from row in GetAllData().Rows
        select new Customer
        {
            CustomerId = row.Field<string>("CustomerId"),
            FirstName = row.Field<string>("FirstName"),
            LastName = row.Field<string>("LastName"),
        };
}