2016-10-30 8 views
3

私は1対多の関係を持つ2つのエンティティを持っていますが、それを多対多に切り替えるつもりですが、グループ化とカウントに役立つ必要があります。LINQグループ数が多いから多くの場合

検索文字列 - >多くのJobResults

A SearchStingは、ジョブの結果を見つけるために使用され、ジョブの結果は、検索文字列のコレクション・プロパティとして格納されます。

public class SearchString 
{ 
    public int SearchStringId { get; set; } 
    public string SearchStringName { get; set; } 
    public string query { get; set; } 
    public JobFunction JobFunction { get; set; } 
    public JobSeniority JobSeniority { get; set; } 
    public virtual ICollection<JobSearchResult> results { get; set; } 
} 
public class JobSearchResult 
{   
    public int JobSearchResultId { get; set; } 
    public string jobtitle { get; set; } 
    public string company { get; set; } 
    public virtual SearchString SearchString { get; set; } 
} 

私はすべてのジョブ結果の上位5 JobFunctionsを取得します次のように:

var top5jobfunctions = JobSearchResults.Where(a => (a.SearchString != null)). 
      GroupBy(s => new { s.SearchString.JobFunction.JobFunctionId, s.SearchString.JobFunction.JobFunctionName }). 
      Select(g => new { value = g.Key.JobFunctionId, displayname = g.Key.JobFunctionName, count = g.Count() }). 
      OrderByDescending(x => x.count). 
      Take(5).ToList(); 

私は、次のような多くの多くにそれを切り替えるつもりです:

public class SearchString 
{ 
    public int SearchStringId { get; set; } 
    public string SearchStringName { get; set; } 
    public string query { get; set; } 
    public JobFunction JobFunction { get; set; } 
    public JobSeniority JobSeniority { get; set; } 
    public virtual ICollection<JobSearchResult> results { get; set; } 
} 
public class JobSearchResult 
{   
    public int JobSearchResultId { get; set; } 
    public string jobtitle { get; set; } 
    public string company { get; set; } 
    public virtual ICollection<SearchString> SearchStrings { get; set; } 
} 

一度上位5つのジョブ機能を取得するにはどうすればよいですか?

また、適切なアプローチを選択した構造はありますか?たとえば、jobresultsを持つSearchStringの子コレクションが、おそらく最善の方法ではなかったのだろうか、おそらく私はSearchStringをJobResultのコレクションプロパティにするだけでよいのだろうかと思います。多くの多くの関係に変更されたモデルのために

答えて

1

、元のクエリに以下の変更を検討するには:

var top5jobfunctions = 
    JobSearchResults.SelectMany(j => j.SearchString.Select(s => new {j,s})) 
        .Where(j => (j.s != null)) 
        .GroupBy(j => new { j.s.JobFunction.JobFunctionId, j.s.JobFunction.JobFunctionName }) 
        .Select(g => new { value = g.Key.JobFunctionId, displayname = g.Key.JobFunctionName, count = g.Count() }) 
        .OrderByDescending(x => x.count) 
        .Take(5).ToList(); 

説明:

  • JobSearchResultICollection<SearchString>が含まれているので、それが実行に平坦化必要
  • SelectManyは、データをフラット化し、各SearchString
  • のレコードが含まれている匿名型、あなたが設計してきたように今後は同様のロジックは、私が好むではないでしょう

モデルの正し

  • 、この種のを踏襲しているような結果関係が不必要に全体的な照会とデータ挿入を複雑にするので、

  • 私の理解では1対多関係船は、関連するすべての情報を取得するのに良い仕事をするでしょう。この場合は、を集約してSearchStringにするか、またはその逆の関係を適性に基づいて行うことを検討してもよいでしょう。解決する。

+0

何が起きているのかは、検索文字列を使用してジョブを見つけて、別の検索文字列を使用して同じジョブを見つけても、別の検索文字列の下に既に追加されているためです。目標は、複数の検索文字列の下でジョブが見つかったことを確認することです。代わりにJobSearchResultのSearchStringコレクションプロパティを持つほうがよいと思っています。あなたの答えはまさに私が探していたものです。それはSelectManyを理解するのにも役立ちました。ありがとうございました –

関連する問題