我需要使用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>
并为Equals
和GetHashCode
提供合适的定义,否则它将使用默认实现:比较引用相等性(假设您使用的是引用类型)。
从手册中:
在您的情况下,看起来您可能只需要比较ID,但是您可能还需要比较其他字段,具体取决于两个对象“相同”对您的含义。
您也可以考虑使用 DistinctBy
中的morelinq。
请注意,这仅是LINQ to Objects,但是我假设这就是您正在使用的。
另一个选择是结合GroupBy
和First
:
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/