Linq - 从另一个中删除一个匿名列表

时间:2014-07-07 13:12:41

标签: c# linq linq-to-sql

我已经看到了很多答案 - 但似乎无法使它们发挥作用:

 var numinqtoday = bc.SSRecs.Where(x => x.DateTime == id).Select(n => new
       {
           refer = n.@ref
       }).GroupBy(x => x.refer).ToList();

 var numinqprev = bc.SSRecs.Where(x => x.DateTime < id).Select(n => new
       {
           refer = n.@ref
       }).GroupBy(x => x.refer).ToList();


 var filtered = numinqtoday.Except(numinqprev).ToList();

在上面的代码中:

 numinqtoday.Count() = 184
 numinqprev.Count() = 155

 filtered.Count() = 184

我已经检查过numinqtoday中numinqprev中肯定会发生 - 所以看起来.Except在放入过滤之前没有删除它们。

有人可以告诉我哪里出错了吗?

谢谢,

标记

1 个答案:

答案 0 :(得分:8)

您已经在那里找到了群组的列表 - 我怀疑您会发现一个群组永远不会与另一群体相等。我怀疑你想在分组之前执行Except操作。例如:

var numinqtoday = bc.SSRecs.Where(x => x.DateTime == id).Select(n => new
   {
       refer = n.@ref
   }).ToList();
var numinqprev = bc.SSRecs.Where(x => x.DateTime < id).Select(n => new
   {
       refer = n.@ref
   }).ToList();
var filtered = numinqtoday.Except(numinqprev).GroupBy(x => x.refer).ToList();

另一种选择是创建一组密钥,并使用Where

// Code as per your original, including the GroupBy calls. Change the string
// part as per the type of refer, which we don't know...
var keys = new HashSet<string>(numinqprev.Select(g => g.Key));
var filtered = numinqtoday.Where(g => !keys.Contains(g.Key)).ToList();

另请注意,如果您只拥有一个属性,那么使用匿名类型就没什么意义了。