2013-05-09 66 views
0

IQueryable的名單上有如下兩個列表:過濾一個與另一個

var processedOrders = this._requestReviewRecordService.GetAll().ToList(); 
var orders = _orderRepository.Table.Where(o => o.OrderStatusId == (int)OrderStatus.Complete && o.CreatedOnUtc < EntityFunctions.AddMinutes(DateTime.Now, -minutes)).ToList(); 

名單有不同的類型,但都包含一個名爲的OrderId屬性。

基本上我想篩選匹配OrderId的任何記錄的第二個「訂單」列表。

我試過Linq的Except方法,但是這似乎只能很好地與原始類型一起玩。

任何人都可以指出我正確的方向 - 我不認爲這會非常具有挑戰性!

在此先感謝 鋁

+0

你是否在使用linq實體? – 2013-05-10 02:18:26

回答

0

這裏是一個樣本,做你以後:

public class TypeOne 
    { 
     public int OrderId { get; set; } 
     public string SomeOtherField { get; set; } 
    } 

    public class TypeTwo 
    { 
     public int OrderId { get; set; } 
     public string MainField { get; set; } 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      // A little bit of setup 
      var first = new List<TypeOne>() { new TypeOne { OrderId = 1, SomeOtherField = "One" }, new TypeOne { OrderId = 2, SomeOtherField = "Two" } } ; 
      var second = new List<TypeTwo>() { new TypeTwo { OrderId = 1, MainField = "One" }, new TypeTwo { OrderId = 2, MainField = "Two" }, new TypeTwo { OrderId = 3, MainField = "Buckle" }, new TypeTwo { OrderId = 4, MainField = "MyShoe" } }; 

      // Here's where we do the interesting bit 
      var firstIds = from id in first 
          select id.OrderId; 

      var query = from item in second 
         where firstIds.Contains(item.OrderId) 
         select item; 


      // And some boring results 
      foreach (var i in query) 
      { 
       Console.WriteLine(string.Format("[OrderId: {0}, MainField: {1}]", i.OrderId, i.MainField)); 
      } 

      Console.ReadLine(); 

     } 

請記住這個例子是使用簡單的列表作爲商店的對象。如果您在任何查詢中使用Entitiy Framework EntitySet作爲源集合,則此方法並不總是有效,因爲它們尚未實施與EF一起使用的Contains <>()的擴展方法。話雖如此,你可以首先將你的查詢實現到列表中,然後這種方法就可以工作。

+0

不錯的簡單工作解決方案 - 非常感謝! – higgsy 2013-05-10 15:21:59