2013-05-09 4 views
0

У меня есть два списка, как показано ниже:Filtering один список 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, но, похоже, он играет только с примитивными типами.

Может ли кто-нибудь указать мне в правильном направлении - я не думал, что это будет так сложно!

Заранее спасибо Al

+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(); 

     } 

Имейте в виду, что этот пример использует простые списки в магазинах для объектов. Этот подход не всегда работает, если вы используете Entity Framework EntitySet в качестве исходной коллекции в любом из ваших запросов, потому что они не реализовали метод расширения для Содержит <>(), который работает с EF. При этом вы могли бы материализовать свои запросы в списки сначала, а затем этот подход будет работать.

+0

Хорошее простое рабочее решение - большое спасибо! – higgsy

Смежные вопросы