我有两个列表如下:
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 :(得分: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;()的扩展方法。话虽这么说,你可以首先在列表中实现你的查询,然后这种方法就可以了。