2

オブジェクトのリストがあり、複数のパラメーターを使用してリストをクエリして、検索ページの結果を絞り込みたいと考えています。

     int SecLink = (!string.IsNullOrEmpty(Request.QueryString["Sector"])) ? Convert.ToInt32(Request.QueryString["Sector"]) : 0;
        int LocLink = (!string.IsNullOrEmpty(Request.QueryString["Location"])) ? Convert.ToInt32(Request.QueryString["Location"]) : 0;
        int IndLink = (!string.IsNullOrEmpty(Request.QueryString["Industry"])) ? Convert.ToInt32(Request.QueryString["Industry"]) : 0;
        int VacLink = (!string.IsNullOrEmpty(Request.QueryString["Vacancy"])) ? Convert.ToInt32(Request.QueryString["Vacancy"]) : 0;

        string keyword = Request.QueryString["SearchTerm"];

        var dx = new DataX();
        var lstJobs = dx.GetAllJobs().Where(x => x.SectorLink.Equals(SecLink) && x.LocationLink.Equals(LocLink) && x.IndustryLink.Equals(IndLink) && x.VacancyTypeLink.Equals(VacLink) && x.JobName.Contains(keyword)).ToList();

        if (lstJobs.Count > 0)
        {
            uiRptSearchJobs.DataSource = lstJobs;
            uiRptSearchJobs.DataBind();

            uiLitSearchResults.Text = string.Format("<h4>Search result found {0} matches</h4>", lstJobs.Count);
        }

前のページから選択されていないため、検索パラメータは「0」である可能性があるため、結果は彼を反映するはずです。

これは私が渡すクエリ文字列です:

Default.aspx?section=search&Sector=4&Location=0&Industry=0&Vacancy=0&SearchTerm=

しかし、ご覧のとおり、クエリ文字列は、ユーザーが前のページから選択した内容に応じて変化します。

4

2 に答える 2

7

私の理解が正しければ、パラメーターの値が 0 の場合はフィルターをかけたくありませんか? もしそうなら、2つの解決策:

  1. 条件でパラメーターが 0 に等しいかどうかを確認します。

    var lstJobs = dx.GetAllJobs().Where(x => 
        (SecLink == 0 || x.SectorLink.Equals(SecLink))
        && (LocLink == 0 || x.LocationLink.Equals(LocLink))
        && (IndLink == 0 || x.IndustryLink.Equals(IndLink))
        && (VacLink == 0 || x.VacancyTypeLink.Equals(VacLink))
        && x.JobName.Contains(keyword)).ToList();
    
  2. Linq の良さ、クエリを動的に構築します。

        var query = dx.GetAllJobs().Where(x => x.JobName.Contains(keyword));
    
        if (SecLink != 0)
        {
            query = query.Where(x => x.SectorLink.Equals(SecLink));
        }
    
        if (LocLink != 0)
        {
            query = query.Where(x => x.LocationLink.Equals(LocLink));
        }
    
        if (IndLink != 0)
        {
            query = query.Where(x => x.IndustryLink.Equals(IndLink));
        }
    
        if (VacLink != 0)
        {
            query = query.Where(x => x.VacancyTypeLink.Equals(VacLink));
        }
    
        var lstJobs = query.ToList();
    
于 2012-05-24T15:08:00.563 に答える
3

1 つのオプションは、Where句を条件付きで実行することです。

検索語を AND で結合する必要がある場合:

var lstJobs = dx.GetAllJobs();

if (SecLink > 0)
    lstJobs = lstJobs.Where(x => x.SectorLink.Equals(SecLink))

if (LocLink > 0)
    lstJobs = lstJobs.Where(x => x.LocationLink.Equals(LocLink))

if (IndLink > 0)
    lstJobs = lstJobs.Where(x => x.IndustryLink.Equals(IndLink))

if (VacLink > 0)
    lstJobs = lstJobs.Where(x => x.VacationLink.Equals(VacLink))

// Performance does not suffer because the query will
// not get evaluated until it's required. For example, 
// here we call .ToList, which forces the query to be evaluated.
var result = lstJobs.ToList(); 

ただし、検索用語を OR で結合する必要があることを明確にしました。その場合:

var lstJobs = dx.GetAllJobs().Where(x => x.JobName.Contains(keyword));

if (SecLink > 0)
    lstJobs = lstJobs.Union(
        dx.GetAllJobs().Where(x => x.SectorLink.Equals(SecLink))

if (LocLink > 0)
    lstJobs = lstJobs.Union(
        dx.GetAllJobs().Where(x => x.LocationLink.Equals(LocLink))

etc...
于 2012-05-24T15:06:44.873 に答える