我需要使用LINQ从特定表中收集唯一ID。问题是我还需要一个WHERE语句,该语句应仅根据我已设置的要求过滤结果。与必须大量使用LINQ相对较新,但是我或多或少地使用以下代码:

private void WriteStuff(SqlHelper db, EmployeeHelper emp)
{
    String checkFieldChange;
    AnIList tableClass = new AnIList(db, (int)emp.PersonId);
    var linq = tableClass.Items
        .Where(
           x => x.UserId == emp.UserId
             && x.Date > DateBeforeChanges
             && x.Date < DateAfterEffective
             && (
                     (x.Field == Inserted)
                  || (x.Field == Deleted)))
                )
             ).OrderByDescending(x => x.Id);

    if (linq != null)
    {
        foreach (TableClassChanges item in linq)
        {
            AnotherIList payTxn = new AnotherIList(db, item.Id);
            checkFieldChange = GetChangeType(item.FieldName);

            // Other codes that will retrieve data from each item
            // and write it into a text file
        }
    }
}

我尝试为var linq添加.Distinct,但它仍返回重复的项目(表示具有相同的ID)。我已经阅读了很多站点,并尝试将.Select添加到查询中,但是.Where子句代替了。在其他文章中,查询在检索值并将其放在var中的方式有​​所不同。我也尝试使用.GroupBy,但是当使用Id作为键时,出现“至少一个对象必须实现IComparable”的问题。

该查询实际上有效,并且我能够从具有所需规范的列中输出数据,但是我似乎无法使.Distinct有效(这是唯一缺少的东西)。我试图创建两个变量,一个变量触发一个不同的调用,然后嵌套一个foreach以确保值唯一,但是要收集成千上万条记录来收集性能影响实在太多了。

我也不确定是否必须重写或使用IEnumerable满足我的要求,并认为我会问这个问题,以防万一有更简单的方法,或者是否可以同时使用.Select和.Select在一个陈述中?

最佳答案

为了使 Enumerable.Distinct 适用于您的类型,您可以实现IEquatable<T>并为EqualsGetHashCode提供合适的定义,否则它将使用默认实现:比较引用相等性(假设您使用的是引用类型)。

从手册中:



在您的情况下,看起来您可能只需要比较ID,但是您可能还需要比较其他字段,具体取决于两个对象“相同”对您的含义。

您也可以考虑使用 DistinctBy 中的morelinq

请注意,这仅是LINQ to Objects,但是我假设这就是您正在使用的。

另一个选择是结合GroupByFirst:

 var query = // your query here...
    .GroupBy(x => x.Id)
    .Select(g => g.First());

例如,这也将在LINQ to SQL中起作用。

关于c# - 在单个LINQ语句中使用.Select和.Where,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9410321/

10-12 12:42
查看更多