【问题标题】:How to get all linked records from table [duplicate]如何从表中获取所有链接的记录[重复]
【发布时间】:2020-02-24 10:17:51
【问题描述】:

我有一个 MS SQL 服务器,它的表是自链接的

| 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 的记录链接到 id =12 的先前记录

【问题讨论】:

  • 这个分配record[0] = Record(){Id=3,PrevId=2,Descr="Blah"}不正确
  • @PavelAnikhouski:这只是对结果应该如何的描述
  • 我需要获取从Id=3开始的所有记录的列表 为什么结果包含id等于1和2的记录?请澄清你的问题
  • 听起来您的意思是要按 ID 降序排列它们 - var results = records.OrderByDescending(x =&gt; x.Id);
  • 我以为他想检索层次结构。更像是“给我记录 id 3 及其所有祖先”。

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


【解决方案1】:

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

把这个放在你的主函数中:

        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();
    }

【讨论】:

  • 当 id 有序时,您的解决方案就可以了。请参阅我的问题,我添加了一些编辑。谢谢
  • 澄清一下,您想检索所有 ID 为 3 且之前所有 ID 为 3 的数据?
  • 不,我想检索所有链接在一起的记录。例如:Id=8 -> Id=6->Id=5->id=3 以此类推
  • @SBarkovskis 请检查一下,我对其进行了编辑以满足该要求。
【解决方案2】:

假设您的 DbContext 类似于:

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

从表中检索记录的代码是:

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 的课程和书籍很棒,IMO)。

【讨论】:

    【解决方案3】:

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

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

    ToList() 将导致查询执行。

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

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

    【讨论】:

    • 所有id都在订单中是可以的,但是如果有ID=7且PreviousId=3的记录呢?
    猜你喜欢
    • 2011-01-01
    • 2015-03-20
    • 2018-07-06
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2012-02-07
    相关资源
    最近更新 更多