如何从 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 调用 Record
或 Records
(如果您在模型中设置复数名称)。因此,从 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();
}
我有一个 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 调用 Record
或 Records
(如果您在模型中设置复数名称)。因此,从 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();
}