【问题标题】:How to return multiple classes as IQueryable<T>如何将多个类返回为 IQueryable<T>
【发布时间】:2010-02-19 10:46:56
【问题描述】:

使用 Linq 我想返回一个包含客户和他们拥有的发票的对象。

我了解从方法返回单一类型:

public IQueryable<customers> GetCustomers()
{
    return from c in customers
           select c;
}

但我无法找出多个对象:

public IQueryable<???> GetCustomersWithInvoices()
{
    return from c in customers
           from inv in c.invoices
           select new {c, ci}  // or I may specify columns, but rather not.
}

我感觉我以错误的方式处理这个问题。目标是从控制器调用这些对象并将它们传递给视图,直接或使用 formViewModel 类。

【问题讨论】:

标签: linq-to-sql


【解决方案1】:

在第二种情况下,您正在创建一个具有方法范围的匿名类型。要在方法边界之外传递匿名类型,您需要将返回类型更改为对象。然而,这违背了匿名类型的目的(因为您失去了它提供的强类型),需要反射才能访问所述类型的属性及其值。

如果您想将此结构保持为您的返回类型,您应该创建一个包含属性的类或结构来保存客户和发票值。

【讨论】:

  • 说得有道理,现在要一个名字...:)
  • 我创建了一个作为 list 返回的类。不过我不喜欢它,我宁愿返回一个对象并使用 customer.invoices.invoiceid 等来获取数据。这似乎很乱。
  • 无论如何你应该可以这样做。您只需在打开 DataContext 时指定一个 DataLoadOptions 以在加载客户对象时包含发票。见msdn.microsoft.com/en-us/library/…
【解决方案2】:

您不能从函数返回匿名类型,它们是严格的“内联”类。如果要将成员封装在函数中,则需要创建一个具体类型来保存成员。

正如您所提到的,使用视图模型是放置它们的好地方。

Here 是一篇关于匿名类型的 scottgu 文章。从文章的结论来看:

匿名类型很方便 启用的语言功能 开发人员简洁地定义内联 代码中的 CLR 类型,无需 显式提供一个正式的类 类型的声明。虽然 它们可以在很多场景中使用, 有特别有用的时候 查询和转换/整形数据 使用 LINQ。

该页面的评论线程中有一些很好的讨论。

【讨论】:

  • 从技术上讲,您可以将函数的返回类型设为objectIEnumerable&lt;object&gt;,这样就可以了。但是,您是否可以对结果做任何有用的事情是值得商榷的。
  • 这正是我正在努力解决的问题。我只是想从数据库中查询客户和发票,将它们发送并迭代到网页;这应该不复杂。
【解决方案3】:

如果你真的想,你可以这样做,但是比较尴尬。

public IQueryable<T> GetCustomersWithInvoices(T exampleObject)
{
return from c in customers
from inv in c.invoices
select new {c, ci} // or I may specify columns, but rather not.
}

var exampleObject = new {
Customer c = new Customer(),
Invoice i = new Invoice()
};

var returnedObjectOfAnonymousType = GetCustomersWithInvoices(exampleObject);

通过这种方式,您可以利用类型推断来让您的方法返回匿名类型。您必须使用传递示例对象的这种丑陋方法才能使其工作。我真的不建议你这样做,但我相信这是唯一的方法。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2011-02-04
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多