【问题标题】:Dynamic LINQ Method to return List of different Items from two lists从两个列表返回不同项目列表的动态 LINQ 方法
【发布时间】:2018-11-18 16:10:45
【问题描述】:

我想编写动态 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语句写成字符串并执行?

【问题讨论】:

  • 您只需要继承或使用接口并确保类型具有ISOA2,因为您的代码需要它。然后您可以使您的方法通用并在您的方法上使用where 约束,这样只有那些具有该属性的类型才能发送到您的方法。
  • ISOA2 是 EntityFramework 的关键,我可以为任何实体类型获取它...这就是我在这里问的原因...我可以将以上内容写成字符串并执行吗?

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


【解决方案1】:

你可以使用 Enumerable.Except 像这样

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 接口,并使用不带参数的除重载。

【讨论】:

  • 我使用了 Enumerable.Except 但它是比较整个对象但我想比较一个字段并且该字段与列表不同,该字段将是实体的主键.. .这就是为什么我想把查询写成字符串
  • @ADA,检查 LamdaComparer 部分,它允许在任何条件下进行比较
  • 但我不知道会是什么条件......有时是emp1.ISOA2 == emp2.​​ISOA2 另一次是dept1.ID == dept2.ID 等等
  • 您可以在每种数据类型中实现 IEquatable 接口,这样就可以解决问题
猜你喜欢
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多