【问题标题】:How do I get the next item in a subset of an ordered table using linq?如何使用 linq 在有序表的子集中获取下一项?
【发布时间】:2009-04-10 17:48:47
【问题描述】:

我有两张桌子:

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 查询来做到这一点,但我试图在不额外往返数据库的情况下完成它。

【问题讨论】:

    标签: .net sql linq linq-to-sql


    【解决方案1】:
    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】:
      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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 2013-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多