0

ASP.NET MVC 4 でコード ファースト アプローチを使用してアプリケーションを作成しました。

私は3つのエンティティを持っています。つまり、「Company」、「Service」、および「ServiceFeature」:

public class Company
{
    public int CompanyID { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Description { get; set; }

    public virtual Service SuppliedService { get; set; }

}

public class Service
{
    public int ServiceID { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual ICollection<ServiceFeature> ServiceFeatures { get; set; }

}    

public class ServiceFeature
{
    public int ServiceFeatureID { get; set; }

    [Required]
    public string Name { get; set; }


}

検索フォームがあります。これは、すべての ServiceFeatures のチェックボックスで構成されています。ユーザーはチェックボックスを選択し、選択した ServiceFeatures をサービスに提供している会社の結果を取得します。

以下のように自分のサービスで Company リストを取得しますが、選択した ServiceFeatures を where 句に含める方法に行き詰まっています (for ループを使用した動的 LINQ ?)

var searchResults = _companyService.GetCompanies();
4

2 に答える 2

0

と呼ばれる選択した機能の ID を含むコレクションがあるrequestedと仮定し、選択したすべての機能を含むサービスを提供する会社が必要であると仮定すると、たとえば次のようにすることができます。

var q = from c in searchResults
        let sf = c.SuppliedService.ServiceFeatures
                                  .Select(f => f.ServiceFeatureID)
                                  .Intersect(requested)
        where sf.Count() == requested.Count()
        select c;
于 2012-09-16T07:49:59.203 に答える
0

同様のケースでは、 を使用した linq クエリよりも少し手の込んだアプローチを好みますIntersectIntersect交差する Id 値を持つリストは、リスト内の各 Id に対してコマンドによって構築されるため、深いネストを伴う恐ろしいクエリが生成される可能性がSELECTあります。UNIONこれは、ID の数が少ない場合 (あなたの場合は正しいと思います) は問題になりませんが、数が多いと SQL 例外がスローされる可能性があります。

だから、これは私が好むものです:

var q = context.Companies.AsQueryable();

foreach(int i in featureIds)
{
    int j = i; // prevent modified closure.
    q = q.Where(c => c.SuppliedService.ServiceFeatures.Any(f => f.Id == j));
}

var result = q.ToList();

WHERE EXISTSいくつかの句でクエリを作成します。EXISTSそれぞれが のプライマリ インデックスをシークする (スキャンしない)ため、これは非常に効率的ですServiceFeature。それに加えて、 anINTERSECTは暗黙のDISTINCTです。

まあ、これを指摘したかっただけです。前述のように、レコードの数が少ないと、違いに気付くことはありません。ですから、あなたに最も適したものを選んでください。

于 2012-09-16T21:25:54.177 に答える