【发布时间】:2021-02-07 21:57:39
【问题描述】:
我让这个 LINQ 返回一组记录,这些记录存在于一组中,但另一组中缺少:
var fieldsToDelete = (from field in externalContactsInvolvedFromDb
let item = externalContactsInvolved.FirstOrDefault(i => i.MeetingExternalContactInvolvedId == field.MeetingExternalContactInvolvedId)
where item == null
select field)
.ToList();
externalContactsInvolvedFromDb 和 externalContactsInvolved 是相同类型的对象列表。在这里,我根据主键 (MeetingExternalContactInvolvedId) 从 externalContactsInvolvedFromDb 返回其他集合中不存在的对象列表。
现在,这个逻辑在我的解决方案中的很多地方都重复了,所以我决定将它重写为一个通用方法。不幸的是,我完全被困住了。我想出了这样的东西('U' 是 ExternalContactInvolved 的通用类型):
string relatedEntityPK = "MeetingExternalContactInvolvedId";
var x2 = Expression.Parameter(typeof(U), "i");
var y2 = Expression.Parameter(typeof(U), "meeting");
var equalExp2 = Expression.Equal(
Expression.Property(x2, relatedEntityPK),
Expression.Property(y2, relatedEntityPK)
);
var lambda2 = Expression.Lambda<Func<U, bool>>(equalExp2, x2);
用这个我可以写这个:
_context.Set<U>.AsNoTracking().FirstOrDefault(lambda)
但是,它自然不会比较两个数据集,并且会返回无法生成 WHERE 子句的错误。你能帮帮我吗?
【问题讨论】:
-
您为什么要这样做?即使您设法创建此表达式,维护性也会丢失。
-
我在整个解决方案的多个地方都使用了这个逻辑,设备之间的唯一区别是使用的类。与其将它复制到 10-20-30 几乎完全相同的方法中,我认为最好使用一种通用方法。我认为维护一个复杂的方法(反正不需要太多调整)比维护30个简单的方法要好。
-
你觉得通用函数应该是什么样子的?哪些参数?首先将您的查询转换为方法链,然后尝试模拟。无论如何,我认为您必须使用 LEFT JOIN 而不是 FirstOrDefault。
标签: c# linq .net-core entity-framework-core