我有两个名为OfflineOrderLineItem.cs和OnlineOrderLineItems.cs的类,它们都有名为offline和Online 的不同订单表
在这方面,我想合并两个表的数据来搜索和显示来自两个表的字段
如何在mvc4中使用linq???有什么想法吗。。。。。
public virtual IPagedList<OnlineOrderLineItem> SearchOrderLineItems(string PoNumber)
{
var query1 = (from ol in _offlineOrderLineItemRepository.Table
select new
{
ol.Name
}).ToList();
var query2 = (from opv in _onlineOrderLineItemRepository.Table
select new
{
opv.Name
}).ToList();
var finalquery = query1.Union(query2);
if (!String.IsNullOrWhiteSpace(Name))
finalquery = finalquery.Where(c => c.Name == Name);
var orderlineitems = finalquery.ToList(); //its not working it throw a error
return new PagedList<OnlineOrderLineItem>(orderlineitems);//error
}
错误
cannot convert from 'System.Collections.Generic.List<AnonymousType#1>'
to 'System.Linq.IQueryable<Nop.Core.Domain.Management.OnlineOrderLineItem>'
to 'System.Linq.IQueryable<Nop.Core.Domain.Management.OnlineOrderLineItem>'
query1
和query2
是匿名类型的列表,具有类型为string
的单个属性。(我估计ol.Name
和opv.Name
是string
s。)因此,finalQuery
和orderlineitems
也是该匿名的集合。通过指定PagedList<T>
,您需要传递到构造函数的集合是T
类型的枚举。T
是OnlineOrderLineItem
,但传递给构造函数的枚举是匿名类型,它是另一种类型。结果:编译器错误。
为了解决这个问题,我建议您定义一个命名的助手类型,可以使用它来联合两个不同的类型OfflineOrderLineItem
和OnlineOrderLineItem
:
public class OrderLineItemViewModel
{
public int Id { get; set; }
public string PoNumber { get; set; }
public string Name { get; set; }
// maybe more common properties of `OfflineOrderLineItem`
// and `OnlineOrderLineItem`
}
然后,您的SearchOrderLineItems
方法应该返回该帮助程序类型的分页列表:
public virtual IPagedList<OrderLineItemViewModel> SearchOrderLineItems(
string PoNumber)
{
var query1 = from ol in _offlineOrderLineItemRepository.Table
select new OrderLineItemViewModel
{
Id = ol.Id,
PoNumber = ol.PoNumber,
Name = ol.Name,
// maybe more properties
};
// don't use ToList here, so that the later Union and filter
// can be executed in the database
var query2 = from opv in _onlineOrderLineItemRepository.Table
select new OrderLineItemViewModel
{
Id = opv.Id,
PoNumber = opv.PoNumber,
Name = opv.Name,
// maybe more properties
};
// don't use ToList here, so that the later Union and filter
// can be executed in the database
var finalquery = query1.Union(query2);
// again no ToList here
if (!string.IsNullOrWhiteSpace(PoNumber))
finalquery = finalquery.Where(c => c.PoNumber == PoNumber);
var orderlineitems = finalquery.ToList(); // DB query runs here
return new PagedList<OrderLineItemViewModel>(orderlineitems);
}
仅在查询的最后使用ToList
非常重要。否则,您将把所有OnlineOrderLineItem
和所有OfflineOrderLineItem
的整个表加载到内存中,然后过滤掉内存中具有给定PoNumber
的项,这将是一个很大的开销和性能降低器。
而不是
var orderlineitems = finalquery.ToList();
尝试
var orderlineitems = finalquery.AsQueryable();
发件人https://github.com/TroyGoode/PagedList/blob/master/src/PagedList/PagedList.cs,PagedList采用IQueryable<T>
Queryable.AsQueryable<TElement> Method