2016-12-19 3 views
1

私たちが作業している検索ページでLINQクエリを実装しようとしています。データテーブルからのC#LINQクエリ

ListID ListName TagId TagValue 
1  Name1 1  Tag1 
1  Name1 2  Tag2 
2  Name2 3  Tag3 

基本的にリストは検索カテゴリであり、タグは検索用語です。最初のクエリから返されるデータは、次のように配置されます。私がしようとしているのは、このリストを戻し、それを一意のリストに分けて、関連するタグをページに表示することです。

私は今、私は反対私のSearchCategoriesにリスト名を取得しようとしている、のdataTableにロードされたデータを持っている:

public class SearchCategories 
{ 
    public int SearchCategoryId { get; set; } 

    public string SearchCategoryName { get; set; } 

    public SearchTags searchTags { get; set; } 

    public List<SearchTags> lstSearchTags= new List<SearchTags>(); 
} 

とSearchTagクラス:その後、

public class SearchTags 
{ 
    public int SearchTagId { get; set; } 

    public string SearchTagValue { get; set; } 
} 

とタグをオブジェクトの関連リストに追加します。

ここで私が働いているコードです:

LINQに新しい
dtLists.Load(reader); 

var distinctValues = dtLists.AsEnumerable() 
    .Select(row => new SearchCategories 
    { 
    SearchCategoryId = row.Field<int>("ListNameID"), 
    SearchCategoryName = row.Field<string>("listName") 
    }) 
    .Distinct(); 

が、これは容易にされるべきだと思うが。前もって感謝します。

+3

'(Distinct'ではなく)' GroupBy'を見てください。 –

答えて

1

をこれはGroupByを使用して行うことは、かなり簡単にする必要があります。

dtLists.AsEnumerable() 
    .GroupBy(x => new { ListNameID = x.Field<int>("ListNameID"), ListName = x.Field<string>("ListName") }) 
    .Select(x => new SearchCategories() 
    { 
     SearchCategoryId = x.Key.ListNameID, 
     SearchCategoryName = x.Key.ListName, 
     lstSearchTags = x.Select(y => new SearchTags(){ SearchTagId = y.Field<int>("TagId"), SearchTagValue = y.Field<string>("TagValue") }).ToList() 
    }); 
+0

これは、ありがとうございました! – TrevorGoodchild

1

次のようなものを試してみてください。GroupByを使用してください。あなたのSearchTagsがそのように置き換えられるようにx => new SearchTags(x)を置き換えてください。

dtLists.AsEnumerable() 
    .Select(row => new { 
     SearchCategoryId = row.Field<int>("ListID "), 
     SearchCategoryName = row.Field<string>("listName"), 
     TagId = row.Field<int>("TagId"), 
     TagValue = row.Field<string>("TagValue") 
    }) 
    .GroupBy(x => x.SearchCategoryId) 
    .Select(g => new SearchCategories() { 
       SearchCategoryId = g.Key, 
       SearchCategoryName = g.First().SearchCategoryName, 
       lstSubCategories = g.Select(x => new SearchTags(){ SearchTagId = x.TagId, SearchTagValue = x.TagValue}).ToList() 
       }).ToList(); 
+0

これは私が試したことに最も近いものです。検索タグのプロパティで質問を更新しましたが、正しく構築できません。 – TrevorGoodchild

+0

私は 'SearchTags'の新しい構造を使って答えを更新しました –

1

どの基準で出力するかはわかりませんが、より正確にするかどうかを尋ねるだけです。

void Main() 
{ 
    var list = new List<Data>(){ 
          new Data 
          { 
           ListId = 1, 
           ListName = "Name1", 
           TagId = 1, 
           TagValue = "Tag1" 
          }, 
          new Data 
          { 
           ListId = 1, 
           ListName = "Name1", 
           TagId = 2, 
           TagValue = "Tag2" 
          }, 
          new Data 
          { 
           ListId = 2, 
           ListName = "Name2", 
           TagId = 3, 
           TagValue = "Tag3" 
          }}; 

    //this is to group all SearchCategories by SearchCategoryName 
    var res = list.Select(x => new SearchCategories 
    { 
     SearchCategoryId = x.ListId, 
     SearchCategoryName = x.ListName 
    }).GroupBy(x => x.SearchCategoryName); 

    //to have just distinct categories one time 
    var res2 = list.Select(x => new SearchCategories 
    { 
     SearchCategoryId = x.ListId, 
     SearchCategoryName = x.ListName 
    }).Distinct(new SearchCategoriesComparer()); 

    //display your data here based on a Key. The output should be Key=Name1 with two elements inside and the other one with one element Key=Name2 
    res.Dump(); 

    //display your data here 
    res2.Dump(); 

} 

public class Data 
{ 
    public int ListId {get; set;} 
    public string ListName { get; set; } 
    public int TagId { get; set; } 
    public string TagValue { get; set;} 
} 


public class SearchCategories 
{ 
    public int SearchCategoryId { get; set; } 

    public string SearchCategoryName { get; set; } 

    public List<SearchTags> lstSubCategories = new List<SearchTags>(); 
} 

public class SearchCategoriesComparer : IEqualityComparer<SearchCategories> 
{ 
    public bool Equals(SearchCategories x, SearchCategories y) 
    { 
     return x.SearchCategoryName == y.SearchCategoryName; 
    } 

    public int GetHashCode(SearchCategories obj) 
    { 
     return obj.SearchCategoryName.GetHashCode(); 
    } 
} 


public class SearchTags 
{ 
    public string Tag{ get; set;} 
} 
2

これは仕事を行います。

var result = dtLists.AsEnumerable() 
     .GroupBy(m => new 
     { 
      ListID = m.Field<int>("ListID"), 
      ListName = m.Field<string>("ListName") 
     }, m => m) 
     .Select(m => new 
     { 
      m.Key.ListID, 
      m.Key.ListName, 
      Tags = m.Select(x => new { x.Field<int>("TagId"), x.Field<string>("TagValue") }) 
     }); 

は、その後、もちろん、あなたはあなたのタイプにマップする必要があり...

関連する問題