C# 这是DDD规则吗?
好的,我有一个数据库表,有1000行 我需要从中随机抽取4个条目。 这是一条商业规则。我可以在LINQ或SQL中轻松地执行随机操作。但是我的域项目必须是独立的,不能引用任何其他项目 所以我应该在那里有一个列表,加载所有1000行,然后随机抽取4行进行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
这样行吗?如果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指示数据是物理存储的。这里需要考虑的是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();