是否可以使用单个 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 个不同的查询,但是否可以一次性检索此数据?

是否可以使用单个 linq 查询检索此数据

你不能把它们结合起来吗?

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() 将抛出异常,如果 .选择() 为空)。