2011-10-27 119 views
2

我現在有一個LINQ到實體模型設置如下查詢子集合2個水平LINQ

每個樣品收集測試 每個測試有結果 每個結果具有Status屬性估值是否集合它是可用或已完成

如何將我寫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; } 
} 

回答

0

沒有看到實際的階級結構,我希望這可以幫助一些方式:

var testsWithAvailableResults = from test in dbContext.Tests 
            select new { 
             Results = (from result in test.Results where result.Status == "Available") 
            }; 
+0

我需要一個級別測試是樣本的孩子 –

7

如果我理解你的表結構,那麼它很容易查詢到讓你感興趣的結果

我把一組簡單的類放在一起來測試結果。

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; 
} 

我開了這組測試數據:

Test Data

從這裏很容易查詢數據,僅可用結果:

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 }; 

這給了我此數據:

Bad Data

但是,這不會按照Sample和Test正確分組數據。

一種方式做正確的是創建一個只包含可用的結果,像這樣的新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() 
    }; 

這會產生這樣的結果:

New Data

然而,創建看起來像實際實體但實際上不是來自數據庫的新對象實例可能是不可能或不可取的。可能會意外地將這些對象中的一個持久存儲回數據庫並清除正確的記錄!

因此,我認爲最好的替代方法是創建一個嵌套結構,其中包含未修改的數據庫實體,並在保持嵌套結構的同時在可用的測試中正確包含所有可用的測試!

方法如下:

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() 
    }; 

並且這產生:

Good Data

有了這些結果,您仍然可以訪問不變SampleTest對象,但所有可用的結果進行過濾。

讓我知道這是否有幫助。

+0

我更新了我的帖子與類,所以你可以看到我的課程結構 –

+0

ps獎金,如果我可以得到它在流利的結構和沒有匿名的對象,所有我想在最後是一個列表與正確的數據附加到它 –

+0

根據您的班級結構我的中間查詢將做你想要的很好。你只需要連接它。 – Enigmativity