我目前有一个linq to实体模型,设置如下
每个样本都有测试集合
每个测试都有一个结果集合
每个结果都有“状态”属性,用于评估“可用”还是“已完成”
我怎么写一个linq查询,它将:
获得具有可用结果的样本
仅保留具有可用结果的测试
并且只有每个测试中可用的结果
无法解决这个问题并帮助解决这个问题
书面的确对很多人有帮助
类:
public class Sample
{
public Sample()
{
Tests = new List<Test>();
}
public int Id { get; set; }
public string IdText { get; set; }
public DateTime SampleDate { get; set; }
public DateTime LoginDate { get; set; }
public string Container { get; set; }
public string Product { get; set; }
public string Name { get; set; }
public string Status { get; set; }
public virtual SamplePoint SamplingPoint { get; set; }
public virtual SampleTemplate SampleTemplate { get; set; }
public virtual Customer ForCustomer { get; set; }
public virtual ICollection<Test> Tests { get; set; }
public class Test
{
public Test()
{
Results = new List<Result>();
}
public string Id { get; set; }
public string Status { get; set; }
public string Analysis { get; set; }
public string ComponentList { get; set; }
public virtual Instrument InstrumentUsed { get; set; }
public virtual ICollection<Result> Results { get; set; }
public virtual Sample ForSample { get; set; }
}
public class Result
{
public string Id { get; set; }
public string TestNumber { get; set; }
public string Status { get; set; }
public string Analysis { get; set; }
public string ComponentName { get; set; }
public string Text { get; set; }
public string Units { get; set; }
public double Value { get; set; }
public int OutOfRange { get; set; }
public DateTime SampledDate { get; set; }
public DateTime SampleLoginDate { get; set; }
public string SamplePoint { get; set; }
public virtual Sample ForSample { get; set; }
public virtual Test ForTest { get; set; }
}
最佳答案
如果我了解您的表结构,那么向下查询即可轻松获得您感兴趣的结果。
我整理了一组简单的类来测试结果。
public static class db
{
public static List<Sample> Samples = new List<Sample>();
}
public class Sample
{
public string Name;
public List<Test> Tests = new List<Test>();
}
public class Test
{
public string Name;
public List<Result> Results = new List<Result>();
}
public class Result
{
public string Name;
public string Status;
}
我创建了这组测试数据:
从这里可以很容易地查询数据到可用结果:
var query =
from s in db.Samples
from t in s.Tests
from r in t.Results
where r.Status == "Available"
select new { Sample = s.Name, Test = t.Name, Result = r };
这给了我这些数据:
但这不能按“样本”和“测试”正确分组数据。
正确执行此操作的一种方法是创建仅包含可用结果的新
Sample
和Test
对象,如下所示:var query =
from s in db.Samples
from rt in (
from t in s.Tests
from r in t.Results
where r.Status == "Available"
group r by t into rts
select new Test()
{
Name = rts.Key.Name,
Results = rts.ToList()
})
group rt by s into srts
select new Sample()
{
Name = srts.Key.Name,
Tests = srts.ToList()
};
这将产生以下结果:
但是,不可能或不希望创建看起来像实际实体但实际上不是来自数据库的对象的新实例。可能不小心将其中一个对象持久保存到数据库中,并清除了正确的记录!
因此,一种我认为最好的选择是创建一个嵌套结构,其中包含未修改的数据库实体,并在保留嵌套结构的情况下额外适当地包括可用的测试!
这是如何做:
var query =
from s in db.Samples
from rt in
(from t in s.Tests
from r in t.Results
where r.Status == "Available"
group r by t into rts
select new
{
Test = rts.Key,
AvailableResults = rts.ToArray()
})
group rt by s into srts
select new
{
Sample = srts.Key,
AvailableTests = srts.ToArray()
};
这产生了:
有了这些结果,您仍然可以访问未更改的
Sample
和Test
对象,但是所有对象均按可用结果过滤。让我知道是否有帮助。