如何编写这个linq查询?

时间:2009-12-03 19:15:09

标签: .net linq

我有第一个返回一组实体的查询:

var resultSet = ....query....ToList();

将返回A,B,C,D,E

这个集合中的实体被组织成链,因为它们有一个指向同一类型实体的引用(prevEntityId),即:

A - > B - > d

C - > ë

我想写第二个查询,以便现在只返回A和C,但我不知道如何编写它。

我更倾向于使用linq方法(如.Where())而不是新的linq语法。

谢谢

更新:抱歉,我最初使用“外键”一词在我的问题中使用了错误的词汇。实际上,实体具有对前一实体的直接引用,因此要在第二个查询中选择实体,必须没有其他实体引用它。我认为这需要2个查询,但如果你认为它可以在一个...

3 个答案:

答案 0 :(得分:1)

编辑:好的,由于这种关系与我的预期相反,你正在寻找的实体没有任何实体将其作为前一个实体。

一个选项:

 Where(x => !fullList.Any(y => y.PrevEntityId == x.Id));

现在,如果你的查询实际上是在SQL中执行的,那么值得看看它产生了什么 - 它可能效率不高。它肯定不会在LINQ to Objects中高效。对于LINQ to Objects,你最好用:

 HashSet<string> prevIds = new HashSet<string>(fullList.Select(x => x.PrevId));
 var heads = fullList.Where(x => !prevIds.Contains(x));

如果您可以获得有关您的环境的更多信息,那将有助于我们为您提供帮助。

答案 1 :(得分:0)

我不是100%明确你的实体及其关系,但这会让你开始。

听起来您现在正在尝试从resultSet对象进一步查询。如果想要A和C,那么听起来就像FK会为空。

var cEntities = resultSet.Where(e=>e.prevEntityID == null).ToList();

答案 2 :(得分:0)

您可以编写一个辅助函数,给定链中的最后一个实体为您提供第一个实体。然后你可以将它与pcampbell的答案结合起来获得链中的第一个实体。沿着这些方向的东西

resultSet.Where(e=>e.prevEntityID == null).Select(e => GetHead(e, resultSet)).ToList();

Entity GetHead(Entity current, List<Entity> entities)
{
    Entity next = entities.Where(e => e.prevEntityID = current.id).FirstOrDefault();

     if (next == null)
        return current;
     else
        return GetHead(next, entities);
}