我尝试使用以下查询比较两个通用列表,只想插入修改后的值
所以我写了以下
public ActionResult GetModifiedRecords(IEnumerable<SalesOrder> oldSalesOrderList, List<SalesOrder> newSalesOrderList)
{
var result = (from oldSalesOrder in oldSalesOrderList
from newSalesOrder in newSalesOrderList
where
(oldSalesOrder.Value != newSalesOrder.Value)
select oldSalesOrder).Distinct();
IEnumerable<SalesOrder> modifiedSalesList = new List<SalesOrder>(result);
return modifiedSalesOrder;
}
但这似乎无效
答案 0 :(得分:1)
注意:Linq查询的返回类型为IEnumerable
,您不需要通过强制转换再次创建它;
你有没有试过这样的事情:
public IEnumerable<SalesOrder> GetModifiedRecords(IEnumerable<SalesOrder> oldSalesOrderList, List<SalesOrder> newSalesOrderList)
{
return oldSalesOrderList.Where((x,i)=>newSalesOrderList[i].Value !=x.Value);
}
以上代码仅在两个列表具有相同顺序时才有效,如果不是,您可以尝试这样的事情(假设OrderId
将是一个唯一字段):
return oldSalesOrderList.Where(x =>
newSalesOrderList.Any(y => y.OrderId == x.OrderId && Y.Value !=x.Value));
答案 1 :(得分:1)
您可以像这样获得修改后的记录:
any
我真的不明白你在做什么。但根据你的问题。应该工作。
答案 2 :(得分:1)
您可以从其他答案获得有关如何执行此操作的解决方案,但请让我解释一下您的原始查询无效的原因。想象一下,你用这两个列表调用你的方法:
var list1 = new List<SalesOrder>
{ new SalesOrder { Value = 1 }, new SalesOrder { Value = 2 } };
var list2 = new List < SalesOrder >
{ new SalesOrder { Value = 1 }, new SalesOrder { Value = 3 } };
var res = GetModifiedRecords(list1, list2);
您的查询将从list1
获取第一项,并将其与list2
的第一项进行比较,它会发现它们是相同的,所以它不会选择它。然后,它会将list1
中的第一项与list2
中的第二项进行比较,因为它们不相等,所以即使您没有预料到,它也会从list1
中选择第一项。然后它将对来自list1
的第二项执行相同的操作。因此,最终结果是,即使您只期望差异,也会从list1
返回两个项目。