2009-07-23 37 views
1

我使用LINQ to SQL和我有一個存儲過程,而帶回的結果集看起來像這樣:我希望做的LINQ to SQL:分組和限制記錄集

Type Field1 Field2 
5  1  1 
6  2  0 
21  0  0 

這個記錄集有幾件事:

1)有3組結果,其中一組在field1和field2中都有值,一個在field1中有一個值但不在field2中,一個在field1和field2中有零。

2)我只對一個類型的子集感興趣。我有一個我正在尋找的類型id列表(例如,在本例中爲5和21)。現在,類型值存儲在一個枚舉中,但如果適用,我可以將它們移動到更好的數據類型。 。

我已經得到了我在哪裏可以組中的每個設置,但我不能確定如何限制類型,因此我只帶回那些我感興趣的

這是我有:

var result = from all in dataContext.sp(..variables...) 
      group all by all into list 
      let grp1 = (from a in list 
         where a.field1 != 0 && a.field2 != 0 
         select a) 
      let grp2 = (from b in list 
        where b.field1 == 0 && b.field2 != 0 
        select b) 
      let grp3 = (from c in list 
         where c.field1 == 0 && c.field2 == 0 
         select c) 
      select new { grp1, grp2, grp3 }; 

任何幫助表示讚賞。

回答

4

實際上您是否想要全部這些組的數據?如果是這樣,你還不如做分組早在.NET - 只是在SQL過濾:

// Assuming interestingTypes is an array or list of the interesting types 
var query = db.Whatever.Where(entry => interestingTypes.Contains(entry.Type) 
           // I understand you're not interested in this group 
           && !(entry.Field1==0 && entry.Field2==1)); 

var grouped = query.AsEnumerable() 
        .GroupBy(entry => new { entry.Field1, entry.Field2 }); 

到的GroupBy的替代方法是使用ToLookup:

var lookup = query.AsEnumerable() 
        .ToLookup(entry => new { entry.Field1, entry.Field2 }); 

然後:

var values00 = lookup[new { Field1=0, Field2=0 }]; 

(然後values00將是您的條目類型的IEnumerable<T>

如果你只在個興趣E型爲每個字段組,你可以查找更改爲:

var lookup = query.AsEnumerable() 
        .ToLookup(entry => new { entry.Field1, entry.Field2 }, 
          entry => entry.Type); 

你會以同樣的方式取values00,但每個條目將是類型,而不是整個記錄。

+0

2秒,你贏了這次! :) – leppie 2009-07-23 16:28:08

0

我不認爲你將能夠在一個查詢中做到這一點(也許,但不是沒有它是醜陋的)。

我建議存儲存儲過程的結果,並只使用3個查詢。或修改存儲的proc以返回您正在查找的3個結果集。