C# 根据列表包含的另一个列表中的属性筛选列表
我有一个order对象,其部分类包含更改历史:C# 根据列表包含的另一个列表中的属性筛选列表,c#,.net,list,linq,C#,.net,List,Linq,我有一个order对象,其部分类包含更改历史: public class SomeOrder { public string SomeOrderNumber { get; set; } public string Status { get; set; } public IEnumerable<SomeOrderChangesHistory> ChangesHistory { get; set; } } public partial class SomeOrd
public class SomeOrder
{
public string SomeOrderNumber { get; set; }
public string Status { get; set; }
public IEnumerable<SomeOrderChangesHistory> ChangesHistory { get; set; }
}
public partial class SomeOrderChangesHistory
{
public string PropertyName { get; set; }
public string OldValue { get; set; }
public string NewValue { get; set; }
public DateTime DateTimeUtc { get; set; }
public string UserName { get; set; }
}
公共类SomeOrder
{
公共字符串SomeOrderNumber{get;set;}
公共字符串状态{get;set;}
公共IEnumerable变更存储{get;set;}
}
公共部分类SomeOrderChangesStory
{
公共字符串PropertyName{get;set;}
公共字符串OldValue{get;set;}
公共字符串NewValue{get;set;}
公共日期时间日期时间UTC{get;set;}
公共字符串用户名{get;set;}
}
我将得到一个SomeOrder
的列表,如果这些订单是由api用户更新的,我想过滤掉它们。由api user
更新的订单将在someorderchangestory
类中为UserName
属性提供api user
值
因此本质上,它是一种基于SomeOrderChangesTory
对象的UserName
属性过滤List
的情况,该对象的列表,即IEnumerable
位于SomeOrder
对象内
我如何做到这一点
谢谢 尝试使用LINQ:
public List<SomeOrder> FilterOrdersUpdatedByAPIUser(List<SomeOrder> orders)
{
var ordersUpdatedbyAPIUser = orders
.Where(x => x.ChangesHistory?.OrderByDescending(y => y.DateTimeUtc)
.FirstOrDefault()?.UserName == "api user")
.Select(on => on.SomeOrderNumber);
orders.RemoveAll(r => ordersUpdatedbyAPIUser.Any(a => a == r.SomeOrderNumber));
return orders;
}
public List filterordersupdatedbyapuser(列表顺序)
{
var ordersUpdatedbyAPIUser=订单
.Where(x=>x.ChangesHistory?.OrderByDescending(y=>y.DateTimeUtc)
.FirstOrDefault()?.UserName==“api用户”)
.Select(on=>on.SomeOrderNumber);
orders.RemoveAll(r=>ordersUpdatedbyAPIUser.Any(a=>a==r.SomeOrderNumber));
退货订单;
}
它将过滤由api用户更新的所有订单
使用LINQ尝试以下操作:
public List<SomeOrder> FilterOrdersUpdatedByAPIUser(List<SomeOrder> orders)
{
var ordersUpdatedbyAPIUser = orders
.Where(x => x.ChangesHistory?.OrderByDescending(y => y.DateTimeUtc)
.FirstOrDefault()?.UserName == "api user")
.Select(on => on.SomeOrderNumber);
orders.RemoveAll(r => ordersUpdatedbyAPIUser.Any(a => a == r.SomeOrderNumber));
return orders;
}
public List filterordersupdatedbyapuser(列表顺序)
{
var ordersUpdatedbyAPIUser=订单
.Where(x=>x.ChangesHistory?.OrderByDescending(y=>y.DateTimeUtc)
.FirstOrDefault()?.UserName==“api用户”)
.Select(on=>on.SomeOrderNumber);
orders.RemoveAll(r=>ordersUpdatedbyAPIUser.Any(a=>a==r.SomeOrderNumber));
退货订单;
}
它将过滤所有由api用户更新的订单
您所说的“过滤掉”是什么意思?你用的是EF/EF核心吗?@NetMage EF不起作用。我只是收到一个JSON响应,然后将其解析为C#对象,我需要删除由api用户更新的订单,因为我只需要由person更新的订单。下面发布的答案解决了我的问题,但我不知道为什么被否决(不是我)。可能是因为应该使用LINQ来创建具有所需条件的新集合,并且在名为Filter
的方法中修改原始列表似乎是个坏主意,特别是因为它返回一个与传入的列表相同的列表(对于流畅的编程来说是好的,如果您期望LINQ行为,则是坏的)。最好将其命名为Remove
。。。此外,还有很多不必要的空检查(?。
)正在进行。使用LINQ,您可能会执行类似于var peopleOrders=orders.Where(o=>!o.ChangeHistory.Any(ch=>ch.UserName==“api user”))的操作。ToList()
@NetMage谢谢,您的答案看起来非常简洁。您所说的“过滤掉”是什么意思?你用的是EF/EF核心吗?@NetMage EF不起作用。我只是收到一个JSON响应,然后将其解析为C#对象,我需要删除由api用户更新的订单,因为我只需要由person更新的订单。下面发布的答案解决了我的问题,但我不知道为什么被否决(不是我)。可能是因为应该使用LINQ来创建具有所需条件的新集合,并且在名为Filter
的方法中修改原始列表似乎是个坏主意,特别是因为它返回一个与传入的列表相同的列表(对于流畅的编程来说是好的,如果您期望LINQ行为,则是坏的)。最好将其命名为Remove
。。。此外,还有很多不必要的空检查(?。
)正在进行。使用LINQ,您可以执行类似于var peopleOrders=orders.Where(o=>!o.ChangeHistory.Any(ch=>ch.UserName==“api user”)。ToList()
@NetMage谢谢,您的答案看起来非常简洁。