C# 这是DDD规则吗?

C# 这是DDD规则吗?,c#,linq,domain-driven-design,C#,Linq,Domain Driven Design,好的,我有一个数据库表,有1000行 我需要从中随机抽取4个条目。 这是一条商业规则。我可以在LINQ或SQL中轻松地执行随机操作。但是我的域项目必须是独立的,不能引用任何其他项目 所以我应该在那里有一个列表,加载所有1000行,然后随机抽取4行进行DDD清理 这样行吗?如果db表有100k行怎么办?如果主键是连续的且没有中断,那么这将为100k或更高的表带来巨大的性能优势。即使它们不是连续的,我相信你可以检查一下,然后轻轻地迭代找到它 基本上,你会想要得到一张桌子的计数 var rowCoun

好的,我有一个数据库表,有1000行

我需要从中随机抽取4个条目。 这是一条商业规则。我可以在LINQ或SQL中轻松地执行随机操作。但是我的域项目必须是独立的,不能引用任何其他项目

所以我应该在那里有一个列表,加载所有1000行,然后随机抽取4行进行DDD清理


这样行吗?如果db表有100k行怎么办?

如果主键是连续的且没有中断,那么这将为100k或更高的表带来巨大的性能优势。即使它们不是连续的,我相信你可以检查一下,然后轻轻地迭代找到它

基本上,你会想要得到一张桌子的计数

var rowCount = db.DbSet<TableName>().Count(); //EF for pseudo 
然后迭代通过id获取记录(这也可以通过使用contains和id来完成,我不确定哪个更快,但是只有4个find应该快速执行)

var randomRecords=新列表();
foreach(randIds中的int-id)
{
var match=db.DbSet().Find(id);
//如果该id不存在,则可以迭代一点以找到它
//或者按照您在注释中的指示为确切记录提供自定义列
while(匹配!=null)
{
match=db.DbSet().Find(++id);
}
随机记录。添加(匹配);
} 

如果主键是连续的并且没有中断,那么对于100k或更高的表来说,这将产生巨大的性能优势。即使它们不是连续的,我相信你可以检查一下,然后轻轻地迭代找到它

基本上,你会想要得到一张桌子的计数

var rowCount = db.DbSet<TableName>().Count(); //EF for pseudo 
然后迭代通过id获取记录(这也可以通过使用contains和id来完成,我不确定哪个更快,但是只有4个find应该快速执行)

var randomRecords=新列表();
foreach(randIds中的int-id)
{
var match=db.DbSet().Find(id);
//如果该id不存在,则可以迭代一点以找到它
//或者按照您在注释中的指示为确切记录提供自定义列
while(匹配!=null)
{
match=db.DbSet().Find(++id);
}
随机记录。添加(匹配);
} 

基于Travis的代码,这应该适合您。它基本上得到一个记录计数,生成4个随机数,然后请求表中的第n条记录并将其添加到结果列表中

var rowCount = db.TableName.Count();
var rand = new Random();
var randIds = Enumerable.Range(0,4).Select(i => rand.Next(0,rowCount));

var randomRecords = new List<TableName>();
foreach(int id in randIds)
{
    var match = db.TableName
      .OrderBy(x=>x.id) // Order by the primary key -- I assumed id
      .Skip(id).First();
    randomRecords.Add(match);
}

基于Travis的代码,这应该适合你。它基本上得到一个记录计数,生成4个随机数,然后请求表中的第n条记录并将其添加到结果列表中

var rowCount = db.TableName.Count();
var rand = new Random();
var randIds = Enumerable.Range(0,4).Select(i => rand.Next(0,rowCount));

var randomRecords = new List<TableName>();
foreach(int id in randIds)
{
    var match = db.TableName
      .OrderBy(x=>x.id) // Order by the primary key -- I assumed id
      .Skip(id).First();
    randomRecords.Add(match);
}


主键是连续的吗?ID可以是1,2,5,7。。。(升序,但其中一些缺失)。不连续:)但我知道你要去哪里,我可以创建一个新列,在其中我可以确保顺序,并且只通过视频计数。只需选择行计数内的四个随机数,然后选择SQL Server中的行。谢谢!似乎合法@Proka它不是最被认可的实践,但该值保证是每行的相对数量(可能是存储在磁盘上的)。我们工作的AS/400(System i)使用了
RRN
(相对记录编号),但原理是相同的。我们的
RRN
表示数据是物理存储的。主键是连续的吗?ID可以是1,2,5,7。。。(升序,但其中一些缺失)。不连续:)但我知道你要去哪里,我可以创建一个新列,在其中我可以确保顺序,并且只通过视频计数。只需选择行计数内的四个随机数,然后选择SQL Server中的行。谢谢!似乎合法@Proka它不是最被认可的实践,但该值保证是每行的相对数量(可能是存储在磁盘上的)。我们工作的AS/400(System i)使用了
RRN
(相对记录编号),但原理是相同的。我们的
RRN
表示数据是物理存储的。主键是连续的吗?ID可以是1,2,5,7。。。(升序,但其中一些缺失)。不连续:)但我知道你要去哪里,我可以创建一个新列,在其中我可以确保顺序,并且只通过视频计数。只需选择行计数内的四个随机数,然后选择SQL Server中的行。谢谢!似乎合法@Proka它不是最被认可的实践,但该值保证是每行的相对数量(可能是存储在磁盘上的)。我们工作的AS/400(System i)使用了
RRN
(相对记录编号),但原理是相同的。我们的<代码> RRN指示数据是物理存储的。这里需要考虑的是 Skip 是一个非常昂贵的在大表中进行的调用。@ TravISJ不是按主键排序的。我不知道它做了优化。@ TravISJ我会复查,但是主键总是索引,它只需遍历索引即可。也许如果这是一个拥有数十亿行的绝对巨大的表,但是任何事情都会很慢。但我会检查确认的。@TravisJ显然没有我希望的那么优化。在我的快速测试中,在一个6.x百万行的表中请求第600万条记录需要1.6秒,第600条记录需要0.22秒,第二条记录需要0.008秒。所以这不是瞬间的。它正在进行索引遍历,但是遍历许多记录仍然需要时间。这里要考虑的一件事是:<代码>跳过可能是在大型表中进行的非常昂贵的调用。@ TravISJ如果不是按主键排序。我不知道它是优化的。@ Traviji我会仔细检查,但是由于主键总是被索引的,所以它只需要遍历索引。也许是一张绝对大的桌子
var idMax = db.TableName.Max(t=>t.id);
var rand = new Random();
var randomRecords = new List<TableName>();
while(randomRecords.Count()<4)
{
   var match = db.TableName.Find(rand.Next(0,idMax));
   if(match!=null)
     randomRecords.Add(match);
}
var idMax = db.TableName.Max(t=>t.id);
var rand = new Random();
var randIds = Enumerable.Range(0,4).Select(i => rand.Next(1,idMax));
var query=db.TableName.Where(t=>false);

foreach(int id in randIds)
{
   query=query.Concat(db.TableName.OrderBy(t=>t.id).Where(t=>t.id>=id).Take(1));   
}
var randomRecords=query.ToList();