是否可以使用单个 linq 查询检索此数据
本文关键字:检索 数据 查询 linq 可以使 单个 是否 | 更新日期: 2023-09-27 18:33:50
我正在使用实体框架。下面的类表示数据库中的表。
public partial class TermBucket
{
public short ID { get; set; }
public byte Period { get; set; }
public byte Min { get; set; }
public byte Max { get; set; }
}
PK 是 ID 和周期,因此表中可以有多个 ID。
查询实体时,我可以使用周期 + 时间(与周期关联的数字)。period被设置为枚举,所以我会将其用作:
Time: 3
Period: 3 (Days)
我想做的是找到与需求匹配的存储桶,然后获取该存储桶的所有条目。这是我目前所做的:
第 1 步:获取 ID
return r.Find() // this is my repository
.AsNoTracking()
.Where(x => (int)tp.Period == x.Period && tp.Time >= x.Min && tp.Time <= x.Max)
.Select(x => x.ID)
.Single();
步骤 2:使用检索到的 ID 获取 ID 的所有条目
return r.Find()
.AsNoTracking()
.Where(x => x.ID == ID );
因此,有 2 个不同的查询,但是否可以一次性检索此数据?
你不能把它们结合起来吗?
return r.Find()
.AsNoTracking()
.Where(x => x.ID == r.Find()
.AsNoTracking()
.Where(x => (int)tp.Period == x.Period && tp.Time >= x.Min && tp.Time <= x.Max)
.Select(x => x.ID)
.Single());
您可以使用 join 来执行此操作。例
public partial class TermBucket
{
public short ID { get; set; }
public byte Period { get; set; }
public byte Min { get; set; }
public byte Max { get; set; }
}
static void Main(string[] args)
{
List<TermBucket> l = new List<TermBucket>();
l.Add(new TermBucket() { ID = 1, Period = 3, Min = 10, Max = 14 });
l.Add(new TermBucket() { ID = 1, Period = 4, Min = 10, Max = 13 });
l.Add(new TermBucket() { ID = 1, Period = 5, Min = 100, Max = 25 });
l.Add(new TermBucket() { ID = -1, Period = 3, Min = 10, Max = 12 });
int period = 3;
int minV = 10;
int maxV = 13;
var res = from e in l
join e2 in l on e.ID equals e2.ID
where e.Period == period && minV >= e.Min && maxV <= e.Max
select e2;
foreach (var r in res)
{
Console.WriteLine(r.ID + " " + r.Period);
}
Console.ReadLine();
}
将输出
1 3
1 4
1 5
是的,它是:
return r.Find()
.AsNoTracking()
.Where(x => x.ID == r.Find()
.AsNoTracking()
.Where(x => (int)tp.Period == x.Period && tp.Time >= x.Min && tp.Time <= x.Max)
.Select(x => x.ID)
.Single());
但我建议将其分解为两个查询,因为您已经拥有它,以处理第一个查询不返回任何结果的情况。(目前,.Single() 将抛出异常,如果 .选择() 为空)。