在MVC中使用Linq组合具有不同数据的表

本文关键字:数据 组合 MVC Linq | 更新日期: 2023-09-27 17:57:36

我有两个名为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>'

在MVC中使用Linq组合具有不同数据的表

query1query2是匿名类型的列表,具有类型为string的单个属性。(我估计ol.Nameopv.Namestrings。)因此,finalQueryorderlineitems也是该匿名的集合。通过指定PagedList<T>,您需要传递到构造函数的集合是T类型的枚举。TOnlineOrderLineItem,但传递给构造函数的枚举是匿名类型,它是另一种类型。结果:编译器错误。

为了解决这个问题,我建议您定义一个命名的助手类型,可以使用它来联合两个不同的类型OfflineOrderLineItemOnlineOrderLineItem:

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