1

私は OfflineOrderLineItem.cs と OnlineOrderLineItem.cs という名前の 2 つのクラスを持っています。両方とも、offline と Online という名前の diff Order テーブルがあります。

その中で、2つのテーブルデータを組み合わせて検索し、両方のテーブルからフィールドを表示したい

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>'
4

2 に答える 2

2

query1およびquery2は、 type の単一のプロパティを持つ匿名型のリストですstring。( ol.Nameandopv.Namestrings であると仮定します。) したがってfinalQuery、 andorderlineitemsもこの無名のコレクションです。指定することによりPagedList<T>、コンストラクターに渡されるコレクションが type の列挙型であることを要求しますTTですがOnlineOrderLineItem、コンストラクターに渡される列挙型は、別の型である匿名型です。結果: コンパイラ エラー。

OfflineOrderLineItemこの問題を解決するには、2 つの異なる型とを結合するために使用できる名前付きヘルパー型を定義することをお勧めします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ことになり、大きなオーバーヘッドとパフォーマンスの低下を招くことになります。

于 2013-03-09T19:22:05.813 に答える
1

それ以外の

 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

于 2013-02-05T17:11:45.747 に答える