将查询从IList转换为对象

时间:2010-10-31 02:37:12

标签: c#

我是c#的新手,我在将其分配给查询后尝试访问IList时遇到问题。这是我的代码:

System.Collections.IList Invoices =
     (from p in entities.InvoiceCards
      where (p.CustomerCard.ID == CustomerID)
      select new
      {
         InvoiceID = p.ID,
         InvoiceDatetime = p.DateTime,
         InvoiceTotal = (decimal) p.InvoiceTotal,
      }).ToList();

// update the grid
invoiceCardDataGridView.DataSource = Invoices;

-----------这里编译器抱怨对象c?如何在不再执行查询的情况下访问IList中的对象?我需要使用IList作为数据源。什么是更好的方式?请包含代码

foreach (var c in Invoices)
    InvoiceTotal += (decimal)c.InvoiceTotal;

4 个答案:

答案 0 :(得分:1)

您在查询中使用匿名类型的问题。 因此,当您获得此匿名类型的IList并分配给数据源时,默认情况下您将丢失其类型。

如果要从代码的另一部分的DataSource中检索它,则必须使用适当的类型进行转换。由于匿名类型是由编译器生成的,因此无法对其进行强制转换。

解决方案是创建包含类型的类(如果不存在)。

public class InvoicePart
{
   public int InvoiceID {get; set}
   public DateTime InvoiceDatetime {get; set}
   public decimal InvoiceTotal {get; set}
}

现在,您可以修改查询以获取类型化列表

List<InvoicePart> Invoices =
     (from p in entities.InvoiceCards
      where (p.CustomerCard.ID == CustomerID)
      select new InvoicePart
      {
         InvoiceID = p.ID,
         InvoiceDatetime = p.DateTime,
         InvoiceTotal = (decimal) p.InvoiceTotal,
      }).ToList();

// update the grid
invoiceCardDataGridView.DataSource = Invoices;

当您获得数据时,您将把它投射到列表

List<InvoicePart> Invoices = (List<InvoicePart>)invoiceCardDataGridView.DataSource;

foreach (InvoicePart c in Invoices)
{
    invoiceTotal += c.InvoiceTotal;
}

答案 1 :(得分:0)

如果列表包含匿名类型,并且foreach循环使用的是另一种方法而不是第一个代码块,则不能以这种方式使用它。

请查看this post可能对您的案件有所帮助。

答案 2 :(得分:0)

如果您绝对必须使用IList,那么您最好定义显式类型而不是使用匿名类型。然后,当您需要使用它们时,您必须将IList的元素强制转换为显式类型。

答案 3 :(得分:0)

Zied有正确的想法来解决这个问题。但请注意,绑定到List<T>不是双向的(对列表的更改不会反映在网格中)。为此,您需要使用BindingSource

List<InvoicePart> Invoices =
     (from p in entities.InvoiceCards
      where (p.CustomerCard.ID == CustomerID)
      select ...

// update the grid
var bs = new BindingSource();
bs.DataSource = Invoices;
invoiceCardDataGridView.DataSource = bs;