我正在使用Entity Framework。下面的类表示数据库中的表。
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和Period,因此表中可以有多个ID。
在查询实体时,我可以使用期间+时间(与期间相关的数字)。句点设置为枚举,因此我将其用作:
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个不同的查询,但是可以一次检索这些数据吗?
答案 0 :(得分:0)
你能不能将它们合并?
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());
答案 1 :(得分:0)
您可以使用加入来完成。实施例
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
答案 2 :(得分:0)
是的,它是:
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());
但是我建议将它分解为两个查询,就像你已经拥有它一样,来处理第一个查询没有返回结果的情况。 (实际上,如果.Select()为空,.Single()将抛出异常。)