动态LINQ方法从两个列表中返回不同项目的列表

时间:2018-11-18 16:10:46

标签: c# .net entity-framework linq lambda

我想编写动态LINQ函数以返回两个列表之间的差异,但是以抽象的方式使该函数采用相同类型的任何两个列表并返回作为第一个列表的项,而不返回第二个列表的项

我写了类似下面的东西,并且工作正常,但是正如我上面提到的,我需要抽象的方式

List<Employee> a  = List of Items; 
List<Employee> b  = List of Items;
var finalCountries = a.Where(u => !b.Any(u2 => u2.ISOA2 == u.ISOA2)).ToList();

我了解了有关动态LINQ表达式的信息,但它很复杂,我没有运气找到想要的东西

是否可以将上述where语句编写为字符串并执行?

1 个答案:

答案 0 :(得分:0)

您可以使用Enumerable。除了这样

List<Employee> a; 
List<Employee> b;
var finalCountries = a.Except(b).ToList();

如果您需要按某个字段比较雇员,而雇员没有实施此操作,则可以使用自定义比较器。例如this one。当您的代码如下所示时:

var comparer = new LambdaComparer<Employee>((emp1,emp2)=>emp1.ISOA2 == emp2.ISOA2);
var finalCountries = a.Except(b,comparer).ToList();

为方便起见,使用LambdaComparer代码:

class LambdaComparer<T> : IEqualityComparer<T>
{
    readonly Func<T, T, bool> _lambdaComparer;
    readonly Func<T, int> _lambdaHash;

    public LambdaComparer(Func<T, T, bool> lambdaComparer) :
        this(lambdaComparer, o => 0){}

    public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
    {
        _lambdaComparer = lambdaComparer ?? throw new ArgumentNullException(nameof(lambdaComparer));
        _lambdaHash = lambdaHash ?? throw new ArgumentNullException(nameof(lambdaHash));
    }

    public bool Equals(T x, T y) => _lambdaComparer(x, y);
    public int GetHashCode(T obj) => _lambdaHash(obj);
}

更新:

要使方法通用,可以在每种实体类型中实现IEquatable接口,并使用不带参数的Except重载。