如果您乐于在客户端执行此操作而不是将其转换为 SQL,则可以修改MoreLinq 的ExceptBy
方法以处理两种不同类型的序列。
然后你可以打电话
var modulelessBlocks =
allBlocks.Except(
allModuleBlocks,
block => block.MID,
moduleblock => moduleblock.MID);
这样做的好处是每个源只迭代一次。
这是修改后的迭代器的示例 - 您必须修改其他方法以匹配:
private static IEnumerable<TSource> ExceptByImpl<TSource, TSecond, TKey>(
this IEnumerable<TSource> first,
IEnumerable<TSecond> second,
Func<TSource, TKey> keySelectorSource,
Func<TSecond, TKey> keySelectorSecond,
IEqualityComparer<TKey> keyComparer)
{
HashSet<TKey> keys = new HashSet<TKey>(
second.Select(keySelectorSecond),
keyComparer);
foreach (var element in first)
{
TKey key = keySelectorSource(element);
if (keys.Contains(key))
{
continue;
}
yield return element;
keys.Add(key);
}
}