Linq to sql 如何将多个类作为IQueryable返回<;T>;
使用Linq,我想返回一个包含客户和发票的对象 我理解从方法返回单个类型:Linq to sql 如何将多个类作为IQueryable返回<;T>;,linq-to-sql,Linq To Sql,使用Linq,我想返回一个包含客户和发票的对象 我理解从方法返回单个类型: public IQueryable<customers> GetCustomers() { return from c in customers select c; } public IQueryable GetCustomers() { 在客户中从c返回 选择c; } 但我很难找出多个对象: public IQueryable<???> GetCustomers
public IQueryable<customers> GetCustomers()
{
return from c in customers
select c;
}
public IQueryable GetCustomers()
{
在客户中从c返回
选择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.
}
public IQueryable GetCustomerWithInvoices()
{
在客户中从c返回
来自c发票中的库存
选择new{c,ci}//或者我可以指定列,但不能指定。
}
我有一种感觉,我正在以错误的方式处理这件事。目标是从控制器调用这些对象,并将它们直接或使用formViewModel类传递给视图。不能从函数返回匿名类型,它们是严格的“内联”类。如果要将成员封装在函数中,则需要创建一个具体类型来容纳它们 正如您所提到的,使用视图模型将是放置它们的好地方 是一篇关于匿名类型的scottgu文章。从文章的结论来看: 匿名类型是一种方便的方法 启用 开发人员要简洁地定义内联 代码中的CLR类型,而不具有 显式地提供一个正式的类 类型的声明。虽然 它们可以在很多场景中使用, 在以下情况下,这些方法特别有用: 查询和转换/成形数据 和林克
在该页面的注释线程中有一些很好的讨论。在第二种情况下,您正在创建一个具有方法作用域的annonymous类型。要在方法边界之外传递注释性类型,需要将返回类型更改为object。然而,这违背了annonymous类型的目的(因为您失去了它提供的强类型),需要反射来访问所述类型的属性及其值
如果要将此结构保留为退货类型,则应创建一个由属性组成的类或结构,以保存客户和发票值。如果确实需要,可以这样做,但这相当棘手
public IQueryable getCustomerwithinvoices(T示例对象)
{
从客户中的c返回
来自c.发票中的库存
选择new{c,ci}//或者我可以指定列,但不能指定。
}
var exampleObject=new{
客户c=新客户(),
发票i=新发票()
};代码>
var returnedObjectOfAnonymousType=GetCustomerWithInvoices(exampleObject);
通过这种方式,您可以利用类型推断让您的方法返回匿名类型。您必须使用这种难看的传递示例对象的方法才能使其工作。我并不真的建议您这样做,但我相信这是唯一的方法。从技术上讲,您可以使函数的返回类型为object
或IEnumerable
,并且它可以工作。不过,你是否能对结果做些有用的事情还有争议。这正是我正在努力解决的问题。我只想从数据库中查询客户和发票,将它们发送到web页面,并将它们迭代出来;这应该不复杂。这是有道理的,现在对于一个名称…:)我创建了一个类,它将作为列表返回。但我不喜欢它,我宁愿返回一个对象并使用customer.invoices.invoiceid等获取数据。这看起来很混乱。无论如何,你应该可以这样做。在打开DataContext时,只需指定DataLoadOptions,即可在加载客户对象时包含发票。请参阅可能的副本