2014-03-04 82 views
0

我有一個表格充滿了地址。我的目標是找到有相似地址的人,並將他們分組在一起。我當然可以這樣做:GroupBy基於參數的多個屬性

var groups = addresses.GroupBy(a => a.FullAddress); 

這很好。但是用戶可以選擇他們希望在GroupBy中應用的地址屬性。例如:

//user selected postalCode & state 
var groups = addresses.GroupBy(a => new { a.PostalCode, a.State }); 

有6個布爾值用戶可以整合到他們的搜索中。有沒有一種簡單的方法通過LINQ來解決這個問題?如果不是,我敢肯定我可以找出一些陳述,但我想象有一個更優雅的解決方案,我找不到任何類似的問題。

這是在ASP.NET MVC項目中,作爲使用實體框架爲報告頁面構建AddressGroupsViewModel的服務的一部分。

public AddressGroupsViewModel GetSearchResults(bool address1, bool address2, bool city, bool state, bool country, bool postalcode) 
{ 

} 

SOLUTION

鑑於公認的答案(這是我需要的幾乎什麼),我創造了這個查詢滿足我的要求:

var groups = dbContext 
       .GroupBy(t => new 
        { 
         Address1 = (address1 ? t.AddressLine1 : ""), 
         Address2 = (address2 ? t.AddressLine2 : ""), 
         City = (city ? t.City : ""), 
         State = (state ? t.State : ""), 
         Country = (country ? t.Country : ""), 
         PostalCode = (postalcode ? t.PostalCode : "") 
        }); 
+0

你能提供你的方法簽名?你回來了什麼? – thepirat000

+1

你在LINQ [LINQ Conditional Group](http://stackoverflow.com/questions/756827/linq-conditional-group)有沒有在條件分組中看過這篇文章? – user1477388

回答

1
public AddressGroupsViewModel GetSearchResults(bool address1, bool address2, bool city, bool state, bool country, bool postalcode) 
{ 
    var result = from t in tableName 
    group t by new { 
     FieldA = (address1 ? "" : t.Address1), 
     FieldB = (address2 ? "" : t.Address2), 
     FieldC = (city ? "" : t.City), 
     FieldD = (state ? "" : t.State), 
     FieldE = (country ? "" : t.Country), 
     FieldF = (postalcode ? "" : t.PostalCode) 
    } into g 
    select g; 
    ...... 
}