可以使用单个linq查询检索此数据吗?

时间:2014-12-09 11:12:56

标签: c# linq

我正在使用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个不同的查询,但是可以一次检索这些数据吗?

3 个答案:

答案 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()将抛出异常。)