LINQ to SQL is an object-relational mapping (ORM) implementation included in ASP.NET Framework 3.5. It lets you model a relational database with .NET classes, query the database with LINQ, and update, insert, or delete data. LINQ to SQL tracks changes to the objects and translates the queries and updates into SQL for the database.
LINQ to SQL supports transactions, views, and stored procedures. It also provides a way to integrate data validation and business logic rules into your data model.
For more information about LINQ to SQL, review the following resources:
RadGrid for ASP.NET AJAX provides a programmatic way to bind to IEnumerable data returned from LINQ queries, as shown in the manual LINQ update demo. The example supports manual data editing, paging, and sorting. Handle the NeedDataSource event to provide the data source, and handle the UpdateCommand, InsertCommand, and DeleteCommand events to edit the data.
The following code snippets show the example configuration. They also demonstrate how to configure RadInputManager to manage user input in the edit and insert forms.
Example: Binding RadGrid to LINQ to SQL for manual CRUD operations
ASP.NET
<telerik:RadCodeBlockID="RadCodeBlock1"runat="server"><scripttype="text/javascript">functionrowDblClick(sender, eventArgs){ sender.get_masterTableView().editItem(eventArgs.get_itemIndexHierarchical());}</script></telerik:RadCodeBlock><telerik:RadAjaxManagerrunat="server"ID="RadAjaxManager1"DefaultLoadingPanelID="RadAjaxLoadingPanel1"><AjaxSettings><telerik:AjaxSettingAjaxControlID="RadGrid1"><UpdatedControls><telerik:AjaxUpdatedControlControlID="RadGrid1"/><telerik:AjaxUpdatedControlControlID="RadWindowManager1"/><telerik:AjaxUpdatedControlControlID="RadInputManager1"/></UpdatedControls></telerik:AjaxSetting></AjaxSettings></telerik:RadAjaxManager><telerik:RadAjaxLoadingPanelrunat="server"ID="RadAjaxLoadingPanel1"/><telerik:RadGridRenderMode="Lightweight"runat="server"ID="RadGrid1"AutoGenerateColumns="false"AllowPaging="true"OnNeedDataSource="RadGrid1_NeedDataSource"OnUpdateCommand="RadGrid1_UpdateCommand"OnItemCreated="RadGrid1_ItemCreated"OnDeleteCommand="RadGrid1_DeleteCommand"OnInsertCommand="RadGrid1_InsertCommand"><MasterTableViewDataKeyNames="ProductID"CommandItemDisplay="Top"InsertItemPageIndexAction="ShowItemOnCurrentPage"><Columns><telerik:GridEditCommandColumnButtonType="ImageButton"/><telerik:GridBoundColumnDataField="ProductID"HeaderText="Product ID"ReadOnly="true"ForceExtractValue="Always"ConvertEmptyStringToNull="true"/><telerik:GridBoundColumnDataField="ProductName"HeaderText="Product Name"/><telerik:GridBoundColumnDataField="UnitsInStock"HeaderText="Units In Stock"/><telerik:GridBoundColumnDataField="UnitPrice"HeaderText="Price"DataFormatString="{0:c}"/><telerik:GridButtonColumnConfirmText="Delete this product?"ConfirmDialogType="RadWindow"ConfirmTitle="Delete"ButtonType="ImageButton"CommandName="Delete"/></Columns><EditFormSettings><EditColumnButtonType="ImageButton"/></EditFormSettings></MasterTableView><PagerStyleMode="NextPrevAndNumeric"/><ClientSettings><ClientEventsOnRowDblClick="rowDblClick"/></ClientSettings></telerik:RadGrid><telerik:RadInputManagerRenderMode="Lightweight"runat="server"ID="RadInputManager1"Enabled="true"><telerik:TextBoxSettingBehaviorID="TextBoxSetting1"></telerik:TextBoxSetting><telerik:NumericTextBoxSettingBehaviorID="NumericTextBoxSetting1"Type="Currency"AllowRounding="true"DecimalDigits="2"></telerik:NumericTextBoxSetting><telerik:NumericTextBoxSettingBehaviorID="NumericTextBoxSetting2"Type="Number"AllowRounding="true"DecimalDigits="0"MinValue="0"></telerik:NumericTextBoxSetting></telerik:RadInputManager><telerik:RadWindowManagerRenderMode="Lightweight"ID="RadWindowManager1"runat="server"/>
C#
privateNorthwindDataContext _dataContext;protectedNorthwindDataContext DbContext
{get{if(_dataContext ==null){
_dataContext =newNorthwindDataContext();}return _dataContext;}}publicoverridevoidDispose(){if(_dataContext !=null){
_dataContext.Dispose();}base.Dispose();}protectedvoidRadGrid1_NeedDataSource(object source,GridNeedDataSourceEventArgs e){
RadGrid1.DataSource = DbContext.Products;}protectedvoidRadGrid1_UpdateCommand(object source,GridCommandEventArgs e){var editableItem =((GridEditableItem)e.Item);var productId =(int)editableItem.GetDataKeyValue("ProductID");// retrieve the entity from the databasevar product = DbContext.Products.Where(n => n.ProductID == productId).FirstOrDefault();if(product !=null){//update entity's state
editableItem.UpdateValues(product);try{// submit changes to the database
DbContext.SubmitChanges();}catch(System.Exception){ShowErrorMessage();}}}privatevoidShowErrorMessage(){
RadAjaxManager1.ResponseScripts.Add(string.Format("window.radalert(\"Please enter valid data!\")"));}protectedvoidRadGrid1_ItemCreated(object sender,GridItemEventArgs e){if(e.Item isGridEditableItem&&(e.Item.IsInEditMode)){GridEditableItem editableItem =(GridEditableItem)e.Item;SetupInputManager(editableItem);}}privatevoidSetupInputManager(GridEditableItem editableItem){// style and set ProductName column's textbox as required var textBox =((GridTextBoxColumnEditor)editableItem.EditManager.GetColumnEditor("ProductName")).TextBoxControl;
textBox.ID ="TextBox1";InputSetting inputSetting = RadInputManager1.GetSettingByBehaviorID("TextBoxSetting1");
inputSetting.TargetControls.Add(newTargetInput(textBox.UniqueID,true));
inputSetting.InitializeOnClient =true;
inputSetting.Validation.IsRequired =true;// style UnitPrice column's textbox
textBox =((GridTextBoxColumnEditor)editableItem.EditManager.GetColumnEditor("UnitPrice")).TextBoxControl;
textBox.ID ="TextBox2";
inputSetting = RadInputManager1.GetSettingByBehaviorID("NumericTextBoxSetting1");
inputSetting.InitializeOnClient =true;
inputSetting.TargetControls.Add(newTargetInput(textBox.UniqueID,true));// style UnitsInStock column's textbox
textBox =((GridTextBoxColumnEditor)editableItem.EditManager.GetColumnEditor("UnitsInStock")).TextBoxControl;
textBox.ID ="TextBox3";
inputSetting = RadInputManager1.GetSettingByBehaviorID("NumericTextBoxSetting2");
inputSetting.InitializeOnClient =true;
inputSetting.TargetControls.Add(newTargetInput(textBox.UniqueID,true));}protectedvoidRadGrid1_InsertCommand(object source,GridCommandEventArgs e){var editableItem =((GridEditableItem)e.Item);//create new entity var product =newLinqToSql.Product();//populate its properties Hashtable values =newHashtable();
editableItem.ExtractValues(values);
product.ProductName =(string)values["ProductName"];if(values["UnitsInStock"]!=null){
product.UnitsInStock =short.Parse(values["UnitsInStock"].ToString());}if(values["UnitPrice"]!=null){
product.UnitPrice =decimal.Parse(values["UnitPrice"].ToString());}
DbContext.Products.InsertOnSubmit(product);try{// submit changes to the database
DbContext.SubmitChanges();}catch(System.Exception){ShowErrorMessage();}}protectedvoidRadGrid1_DeleteCommand(object source,GridCommandEventArgs e){var productId =(int)((GridDataItem)e.Item).GetDataKeyValue("ProductID");// retrieve the entity from the databasevar product = DbContext.Products.Where(n => n.ProductID == productId).FirstOrDefault();if(product !=null){// add the product for deletion
DbContext.Products.DeleteOnSubmit(product);try{// submit changes to the database
DbContext.SubmitChanges();}catch(System.Exception){ShowErrorMessage();}}}
VB.NET
Private _dataContext As NorthwindDataContext
ProtectedReadOnlyProperty DbContext()As NorthwindDataContext
GetIf _dataContext IsNothingThen
_dataContext =New NorthwindDataContext()EndIfReturn _dataContext
EndGetEndPropertyPublicOverloadsOverridesSub Dispose()If _dataContext IsNotNothingThen
_dataContext.Dispose()EndIfMyBase.Dispose()EndSubProtectedSub RadGrid1_NeedDataSource(ByVal source AsObject,ByVal e As GridNeedDataSourceEventArgs)Handles RadGrid1.NeedDataSource
RadGrid1.DataSource = DbContext.Products
EndSubProtectedSub RadGrid1_UpdateCommand(ByVal source AsObject,ByVal e As GridCommandEventArgs)Handles RadGrid1.UpdateCommand
Dim editableItem =(DirectCast(e.Item, GridEditableItem))Dim productId =DirectCast(editableItem.GetDataKeyValue("ProductID"),Integer)' retrieve the entity from the databaseDim product = DbContext.Products.Where(Function(n) n.ProductID = productId).FirstOrDefault()If product IsNotNothingThen'update entity's state
editableItem.UpdateValues(product)Try' submit changes to the database
DbContext.SubmitChanges()Catch generatedExceptionName AsSystem.Exception
ShowErrorMessage()EndTryEndIfEndSubPrivateSub ShowErrorMessage()
RadAjaxManager1.ResponseScripts.Add(String.Format("window.radalert(""Please enter valid data!"")"))EndSubProtectedSub RadGrid1_ItemCreated(ByVal sender AsObject,ByVal e As GridItemEventArgs)Handles RadGrid1.ItemCreated
IfTypeOf e.Item Is GridEditableItem AndAlso(e.Item.IsInEditMode)ThenDim editableItem As GridEditableItem =DirectCast(e.Item, GridEditableItem)
SetupInputManager(editableItem)EndIfEndSubPrivateSub SetupInputManager(ByVal editableItem As GridEditableItem)' style and set ProductName column's textbox as requiredDim textBox =(DirectCast(editableItem.EditManager.GetColumnEditor("ProductName"), GridTextBoxColumnEditor)).TextBoxControl
textBox.ID ="TextBox1"Dim inputSetting As InputSetting = RadInputManager1.GetSettingByBehaviorID("TextBoxSetting1")
inputSetting.TargetControls.Add(New TargetInput(textBox.UniqueID,True))
inputSetting.InitializeOnClient =True
inputSetting.Validation.IsRequired =True' style UnitPrice column's textbox
textBox =(DirectCast(editableItem.EditManager.GetColumnEditor("UnitPrice"), GridTextBoxColumnEditor)).TextBoxControl
textBox.ID ="TextBox2"
inputSetting = RadInputManager1.GetSettingByBehaviorID("NumericTextBoxSetting1")
inputSetting.InitializeOnClient =True
inputSetting.TargetControls.Add(New TargetInput(textBox.UniqueID,True))' style UnitsInStock column's textbox
textBox =(DirectCast(editableItem.EditManager.GetColumnEditor("UnitsInStock"), GridTextBoxColumnEditor)).TextBoxControl
textBox.ID ="TextBox3"
inputSetting = RadInputManager1.GetSettingByBehaviorID("NumericTextBoxSetting2")
inputSetting.InitializeOnClient =True
inputSetting.TargetControls.Add(New TargetInput(textBox.UniqueID,True))EndSubProtectedSub RadGrid1_InsertCommand(ByVal source AsObject,ByVal e As GridCommandEventArgs)Handles RadGrid1.InsertCommand
Dim editableItem =(DirectCast(e.Item, GridEditableItem))'create new entityDim product =New LinqToSql.Product()'populate its propertiesDim values AsNew Hashtable()
editableItem.ExtractValues(values)
product.ProductName =DirectCast(values("ProductName"),String)If values("UnitsInStock")IsNotNothingThen
product.UnitsInStock =Short.Parse(values("UnitsInStock").ToString())EndIfIf values("UnitPrice")IsNotNothingThen
product.UnitPrice =Decimal.Parse(values("UnitPrice").ToString())EndIf
DbContext.Products.InsertOnSubmit(product)Try' submit changes to the database
DbContext.SubmitChanges()Catch generatedExceptionName AsSystem.Exception
ShowErrorMessage()EndTryEndSubProtectedSub RadGrid1_DeleteCommand(ByVal source AsObject,ByVal e As GridCommandEventArgs)Handles RadGrid1.DeleteCommand
Dim productId =DirectCast((DirectCast(e.Item, GridDataItem)).GetDataKeyValue("ProductID"),Integer)' retrieve the entity from the databaseDim product = DbContext.Products.Where(Function(n) n.ProductID = productId).FirstOrDefault()If product IsNotNothingThen'add the product for deletion
DbContext.Products.DeleteOnSubmit(product)Try' submit changes to the database
DbContext.SubmitChanges()Catch generatedExceptionName AsSystem.Exception
ShowErrorMessage()EndTryEndIfEndSub