用另一个过滤一个IQueryable列表

时间:2013-05-09 23:28:50

标签: c# linq lambda nopcommerce

我有两个列表如下:

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方法,但这似乎只适用于原始类型。

任何人都可以指出我正确的方向 - 我不认为这将是非常具有挑战性的!

提前致谢 人

1 个答案:

答案 0 :(得分: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&lt;&gt;()的扩展方法。话虽这么说,你可以首先在列表中实现你的查询,然后这种方法就可以了。