代码之家  ›  专栏  ›  技术社区  ›  Keltex

如何使用LINQ获取已排序表的子集中的下一项?

  •  0
  • Keltex  · 技术社区  · 17 年前

    我有两张桌子:

    Topic (
      TopicID: int, (primary key)
      TopicName: varchar
    );
    
    Example (
      ExampleID: int, (primary key)
      TopicID: int, (foreign key to Topic table)
      ExampleOrder: int,
      ExampleName: varchar
    );
    

    使用linq,给定一个exampleid,我想在同一主题中获得下一个示例(使用同一个topicid)。以下是在SQL中实现这一点的方法:

    DECLARE @ExampleOrder int;
    DECLARE @TopicID int;
    SELECT @ExampleOrder=ExampleOrder, @TopicID=TopicID FROM Example WHERE ExampleID=@ExampleID;
    SELECT TOP 1 ExampleID FROM Example WHERE TopicID=@TopicID AND ExampleOrder>@ExampleOrder ORDER BY ExampleOrder
    

    在Linq中有一个简单的方法可以做到这一点吗?我知道我可以通过两个LINQ查询来完成这项工作,但是我正在尝试在不额外访问数据库的情况下完成这项工作。

    2 回复  |  直到 17 年前
        1
  •  2
  •   Amy B    17 年前
    int exampleID = 5;
      //now to write a query
    var query =
      from ex in db.Examples
      let prior = db.Examples.Where(ex2 => ex2.ExampleID == exampleID).First()
      where ex.TopicID == prior.TopicID
         && ex.ExampleOrder > prior.ExampleOrder
      order ex by ex.ExampleOrder descending
      select ex
        //ok, let's run the query - result will have 0 or 1 item in it.
    List<Example> result = query.Take(1).ToList();
    
        2
  •  2
  •   Daniel Brückner    17 年前
    public Example GetNextExample(IEnumerable<Example> examples, Int32 exampleID)
    {
       Example example = examples.Single(e => e.ExampleId == exampleID);
    
       return examples.
          Where(e => e.TopicID == 
             examples.Single(e => e.ExampleId == exampleID).TopicID).
          OrderBy(e => e.ExampleOrder).
          FirstOrDefault(e => e.ExampleOrder > 
             examples.Single(e => e.ExampleId == exampleID).ExampleOrder);
    }