I've got a text box, combo box, button and DataGridView on the form that's accustomed to search and return customer information from the MSSQL view (vCustomer). It really works great, however i know my code could be more effective. The 4 products within the combobox represent posts to look.

It is possible to simple method of transforming the next to dynamic LINQ to SQL? I'm a new comer to C#. I examined another posts, however i cannot appear to have it working.

public partial class MainForm : Form
{
	public MainForm()
	{
		InitializeComponent();
	}

	private void MainForm_Load(object sender, EventArgs e)
	{
		// columns to filter for
		string[] list = new string[4];
		list[0] = "Name";
		list[1] = "CustomerAccountNo";
		list[2] = "Telephone";
		list[3] = "Postal";

		// bind to combobox
		cboColumn.DataSource = list;
		cboColumn.SelectedIndex = 0;
	}

	private void btnSearch_Click(object sender, EventArgs e)
	{

		try
		{
			Cursor.Current = Cursors.WaitCursor; 
			CustomerSearchDataContext db = new CustomerSearchDataContext();
			IEnumerable<vCustomer> customerQuery = null;
			switch (cboColumn.SelectedIndex)
			{
				case 0:
					customerQuery = from c in db.vCustomers
									where c.Name.Contains(txtSearch.Text)
									orderby c.CustomerAccountNo descending
									select c;
					break;
				case 1:
					customerQuery = from c in db.vCustomers
									where c.Name.Contains(txtSearch.Text)
									orderby c.CustomerAccountNo descending
									select c;
					break;
				case 2:
					customerQuery = from c in db.vCustomers
									where c.Telephone.Contains(txtSearch.Text)
									orderby c.CustomerAccountNo descending
									select c;
					break;
				case 3:
					customerQuery = from c in db.vCustomers
									where c.Postal.Contains(txtSearch.Text)
									orderby c.CustomerAccountNo descending
									select c;
					break;
			}
			customerBindingSource.DataSource = customerQuery;
			dataGridView1.DataSource = customerBindingSource;
			dataGridView1.Columns["CustomerId"].Visible = false;
		}
		catch (System.Data.SqlClient.SqlException ex)
		{
			MessageBox.Show("An Error Occured - " + ex.Message,"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
		finally
		{
			Cursor.Current = Cursors.Default; 
		}
	}
}

Use [System.Linq.Dynamic][1].

Obtain the condition from the method and employ it in one query.

    switch (choice)
    {
        case case1:
            condition = string.Format("{0}.Contains({1})", "Column", "Value"
            break;

Hey Rony. I attempted your suggestion and re considered my code (see below). However, I get an error: No property or area 'smith' is available in type 'vCustomer' . Incidentally, the MessageBox.Show(condition) line returns Title.Consists of(cruz) which looks correct.

What shall we be held doing wrong? Sorry to be a noob and interesting help.

Figured it... required to wrap search string with double quotes! Code continues to be edited.

public partial class MainForm : Form
{
	public MainForm()
	{
		InitializeComponent();
	}
	private void MainForm_Load(object sender, EventArgs e)
	{
		// data column to filter against
		string[] list = new string[4];
		list[0] = "Name";
		list[1] = "CustomerAccountNo";
		list[2] = "Telephone";
		list[3] = "Postal";
		cboColumn.DataSource = list;
		cboColumn.SelectedIndex = 0;

		// left, right or middle search
		string[] list2 = new string[3];
		list2[0] = "Contains";
		list2[1] = "StartsWith";
		list2[2] = "EndsWith";
		cboFilterAtt.DataSource = list2;
		cboFilterAtt.SelectedIndex = 0;
	}

	private void btnSearch_Click(object sender, EventArgs e)
	{
		try
		{
			Cursor.Current = Cursors.WaitCursor; 
			CustomerSearchDataContext db = new CustomerSearchDataContext();
			//string condition = string.Format("{0}.{1}({2})", cboColumn.SelectedValue, cboFilterAtt.SelectedValue, txtSearch.Text);
			string condition = string.Format("{0}.{1}({2})", cboColumn.SelectedValue, cboFilterAtt.SelectedValue, "\"" + txtSearch.Text + "\"");
			MessageBox.Show(condition);
			var customerQuery = db.vCustomers.Where(condition).OrderBy("CustomerAccountNo");
			customerBindingSource.DataSource = customerQuery;
			dataGridView1.DataSource = customerBindingSource;
			dataGridView1.Columns["CustomerId"].Visible = false;
		}
		catch (System.Data.SqlClient.SqlException ex)
		{
			MessageBox.Show("An Error Occured - " + ex.Message,"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
		}
		finally
		{
			Cursor.Current = Cursors.Default; 
		}
	}
}