0

我正在尝试用数据表中的行填充客户模型,但无法获得正确的语法。原始代码取自本教程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;
    }  

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

4

2 回答 2

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.Linqusing指令中以将扩展方法纳入范围。

于 2012-05-31T06:10:19.493 回答
1

你很近。创建迭代器(返回使用 的 IEnumerable/IEnumerator 的函数yield)时,您只需将代码主体中的代码放入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"),
        };
}
于 2012-05-31T04:01:14.360 回答