【发布时间】:2012-02-23 09:34:07
【问题描述】:
我需要使用 LINQ 从特定表中收集 Distinct 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 和.在哪里只用一个语句?
【问题讨论】:
-
您的问题似乎暗示表中有多行具有相同的ID,但数据不同-这不完全合乎逻辑。请说明您的数据是什么样的,以及这些 id 到底发生了什么。
-
嗨乔恩,这实际上是正确的。此处的 Id 是一个事务 ID,并在单个命令中跟踪已更改为特定用户的所有内容(即字段 a、b 和 c 是通过此事务 ID 编辑的)。我需要区分它,因为唯一需要的数据是更新给该特定用户的最新行,因此无论该单个事务中是否有多个编辑,只需要最近的更改。