I had the same problem as you. Most examples of linqdatasource, ilustare WhereParameters> controlparameter functions are cool, but not so powerful.
The answer is simple: Use LinqDataSource and simply implement the "onselecting" event, passing any data you want.
Here is a short example with a full set of features for filtering and swapping (also note that the filled sql is optimal and only requests the top 10 records each time)
Aspx:
<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox> <asp:Button ID="btnFilter" runat="server" Text="Filter" onclick="btnFilter_Click"/> <asp:LinqDataSource ID="LinqDataSource1" runat="server" onselecting="LinqDataSource1_Selecting"> </asp:LinqDataSource> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataSourceID="LinqDataSource1"> <Columns> <asp:BoundField DataField="FirstName" HeaderText="FirstName" ReadOnly="True" SortExpression="FirstName" /> <asp:BoundField DataField="MiddleName" HeaderText="MiddleName" ReadOnly="True" SortExpression="MiddleName" /> <asp:BoundField DataField="LastName" HeaderText="LastName" ReadOnly="True" SortExpression="LastName" /> </Columns> </asp:GridView>
CodeBehind:
protected void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e) { var ctx = new LinqDataSource.DBDataContext(); IQueryable<Customer> customers = ctx.Customers; if (!String.IsNullOrEmpty(txtLastName.Text)) customers = customers.Where ( c => c.LastName.Contains(txtLastName.Text)); e.Result = customers; } protected void btnFilter_Click(object sender, EventArgs e) { GridView1.DataBind(); }
source share