我正在尝试执行查询,在该查询中我返回SQL
表中记录之一的对象。在这种情况下,它是一个DbImageModel
对象(请参见下面的代码)。以下代码非常适合根据查询条件返回单个实体:
s.ImageTag == imageTag
但是我还需要找到一种方法,也可以在当前找到的实体之前和之后返回实体。或者至少是之前和之后实体的imageTag
值。这可能吗?
我的代码如下:
using (UsersDbContext ctx = new UsersDbContext())
{
try
{
DbImageModel image = ctx.Images.Include(i => i.Application)
.OrderBy(c => c.ImageId)
.FirstOrDefault(s => s.ImageTag == imageTag);
// Do something with image
}
catch (Exception ex)
{
throw new NotImplementedException(); // For debugging
}
}
我还应该提到,我的数据库关系是将多个DbImageModel
对象设置为一个DbApplicationModel
。DbApplicationModel
单个DbUserModel
对象有很多对象。
对于开发人员来说,这听起来似乎不应该是一个新问题,但是我还没有找到任何讨论实现此方法的参考。
更新:
我添加了一个订单。我的问题仍然适用。
如果ImageId
始终为增量,则可以在发现的ImageId的设置范围内选择项目:
DbImageModel images =
from i in ctx.Images.Include(i => i.Application)
let match = ctx.Images.FirstOrDefault(s => s.ImageTag == imageTag)
where i.ImageId < match.ImageId + 1 &&
i.ImageId > match.ImageId - 1
order by i.ImageId
select i;
但是,我想您不能总是假设情况确实如此。例如,如果您曾经允许删除图像,则将存在间隙。您最好的选择是使用多次往返。首先使用您提供的代码查找图像,然后:
DbImageModel imageAfter = ctx.Images.Include(i => i.Application)
.OrderBy(i => i.ImageId)
.FirstOrDefault(i => i.ImageId > image.ImageId);
DbImageModel imageBefore = ctx.Images.Include(i => i.Application)
.OrderByDescending(i => i.ImageId)
.FirstOrDefault(i => i.ImageId < image.ImageId);
您可能会提出某种复杂的查询以一次往返生成所有这些查询,但是其复杂性最终可能会使它花费的时间比这三个往返的总和还长。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句