views:

34

answers:

1

I have a basic search control which lists companies from a CRM depending on predefined search/filtering criteria supplied by dropdowns. The default selection is "ALL" for each DropDown, otherwise the user chooses a specific item(s). I'd like to be able to construct a Linq query dynamically based on the selections. Out of the 5 selectors they supply values that I can match against the Company table, but two of the selectors (if either or both are chosen) would require a join or joins, else no action should be taken again the base result set. I hope this makes sense.

I'm not sure how to do this effectively. Here is my code:

private void Search()
{
    EnergyPubsCRMDataContext dc = new EnergyPubsCRMDataContext();

    var results = (from c in dc.Companies
                   select c);


    //only create the join if the selected index > 0
    if (ddlIndustry.SelectedIndex > 0)
    {
        //A company can be in 1 or more industries, thus here I want to join
        //with the CompanyIndustry table and have a WHERE clause to match on the ddlIndustry.SelectedValue
    }

    //only create the join if the selected index > 0
    if (ddlServices.SelectedIndex > 0)
    {
        //A company can offer 1 or more services. Here I want to join to the CompanyService table
        //on the CompanyID and have a WHERE clause to match the ddlServices.SelectedValue
    }        

    //These work OK to shape the overal query further (they don't need joins)
    if (ddlCountry.SelectedIndex > 0)
        results = results.Where(c => c.CountryID == Convert.ToInt32(ddlCountry.SelectedValue));

    if (ddlStateRegion.SelectedIndex > 0)
        results = results.Where(c => c.StateRegionID == Convert.ToInt32(ddlStateRegion.SelectedValue));

    if (ddlAccountManagers.SelectedIndex > 0)
    {
        Guid g = new Guid(ddlAccountManagers.SelectedValue);
        results = results.Where(c => c.UserId == g);
    }

    results = results.OrderBy(c => c.CompanyName);

    //Bind to Grid....        
}
A: 
if (ddlIndustry.SelectedIndex > 0)
{
    //A company can be in 1 or more industries, thus here I want to join
    //with the CompanyIndustry table and have a WHERE clause to match on the ddlIndustry.SelectedValue
    results = results.Where(c => c.CompanyIndustry.IndustryID == ddlIndustry.SelectedValue);
}

Assuming you have correct foreign keys in your database/DBML.

This will generate the join implicitly.

Albin Sunnanbo