如何从 table 获取所有链接记录

How to get all linked records from table

我有一个 MS SQL 服务器 table link 自己

| Id| PreviousId|  Decription |
|---|:---------:|------------:|
| 1 | null      | Blah        |
| 2 | 1         | Blah        |
| 3 | 2         | Blah        |

我需要获取从 Id=3 开始的所有记录的列表。

我的列表应该如下所示:

public class Record{
    public int Id {get;set;}
    public int? PrevId {get;set;}
    public string Desc {get;set;}
}
List<Record> records= new List<Record>();

/*Code to get all records*/

//Result
record[0] = Record(){Id=3,PrevId=2,Descr="Blah"} 
record[1] = Record(){Id=2,PrevId=1,Descr="Blah"} 
record[2] = Record(){Id=1,PrevId=null,Descr="Blah"} 

谢谢!

编辑1: 抱歉,伙计们,但我没有提到 ID 不符合顺序。并且可能存在这样的情况,例如,ID=17 link 的记录到 id =12

的前一条记录

假设您的 DbContext 类似于:

public class MyDbContext : DbContext
{
   public MyDbContext(string connectionString) : base(connectionString) {}
   public DbSet<Record> Records {get; set;}
}

从 table 检索记录的代码是:

var db = new MyDbContext(connectionString);
var records = db.Records.ToList();

或者,如果您想使用 LINQ 语法:

var db = new MyDbContext(connectionString);
var recordsQuery = from record in db.Records
                   select record;
var records = recordsQuery.ToList();

注意:由于问题非常基础,我建议您查看 EntityFramework 文档或课程(我认为 Julie Lerman 的课程和书籍很棒)。

假设您的 table 被命名为 Record,那么在您的模型(上下文 class)中您应该 属性 代表 table 调用 RecordRecords (如果您在模型中设置复数名称)。因此,从 table 获取记录是通过 属性 完成的,您可以在其上使用普通的 LINQ 方法,例如 Where:

var result = dbContext.Records.Where(r => r.Id >= 3).ToList();

ToList() 将导致查询执行。

编辑:根据 PreviousId 进行过滤,然后使用:

var result = dbContext.Records.Where(r => r.PreviousId == 3).ToList();

我编辑了答案以满足获取层次结构的要求。

将其放入您的主要函数中:

        var idList = GetList();

        //The complete heirarchy list
        var ancestorList = new List<Record>();

        //startId will determine the beginning Id of your query
        int? startId = 3;

        while (true)
        {

            if (startId != null)
            {
                ancestorList.Add(GetList()
                  .Where(m => m.Id == startId)
                  .FirstOrDefault());
            }
            else
            {
                break;
            }

            startId = GetPreviousId((int)startId);
        }

        //this is just for checking the list of ids, this is unnecessary
        foreach (var item in ancestorList)
        {
            Console.WriteLine(item.Id);
        }

        Console.ReadLine();

正在检索所有数据:

public List<Record> GetList(){

     var records = new List<Record>();

     using(YourDBContext db = new YourDBContext())
     {
        records = db.records
         .Select(s=> new Record()
         {
           Id = s.Id,
           PrevId = s.PreviousId,
           Desc = s.Description,
         }).ToList();
     }

     return records;
}

正在检索以前的 ID:

    public static int? GetPreviousId(int startId)
    {
        return GetList()
               .Where(m => m.Id == startId)
               .Select(m => m.PrevId) 
               .FirstOrDefault();
    }