Thursday, September 01, 2011

Sort in descending order with multiple columns using LINQ to Object, C#.NET 4.0


Sort in descending order with multiple columns using LINQ to Object, C#.NET 4.0

Below the example of sorting list object in descending order with multiple columns.

NameSpace

using System.Linq;

C#.NET

List<Country> countryList = new List<Country>();

Load countryList Object from source

Descending Order

countryList = countryList.OrderByDescending(c => c.Column1).ThenByDescending(c => c.Column2).ToList<Country>();

Ascending Order (Default)

countryList = countryList.OrderBy(c => c.Column1).ThenBy(c => c.Column2).ToList<Country>();

Note:  For more than 2 columns, you can again use “.ThenBy” clause for column3, column4 etc.

SQL Server Database DML Operation (Insert/ Update /Delete) with Microsoft Entity Framework 4.0


SQL Server Database DML Operation (Insert/ Update /Delete) with Microsoft Entity Framework 4.0

When you use Entity Framework for database DML (Insert, Update and Delete) operation then it is very common to get errors like
  • “Foreign Key References”
  • “The DELETE statement conflicted with the REFERENCE constraint”

Here you need to be very careful when sending object into entity methods
Normally we use following methods to do database operation using entity framework 
  • AddObject
  • ApplyChanges
  • Attach
  • DeleteObject

Suppose you have some objects which is having child objects like

Object Structure

-Country
----Airports
------Name
--------Address
----FerriesTerminal
------Name
--------Address 

Namespace (.Net Entity Framework 4.0)

using System.Collections.Generic;
using System.Linq;
using System.Transactions;
using System.Data.Entity; 
      
Now if you are doing some operation on one particular object like delete “Country”, you have to nullify all the under laying objects before sending it for delete operation.

Like: Let’s say you are working with “Country” object only, not dealing with other under laying object ex: “Airport”, “Name” etc.

List<Country> country = new List<Country>();

Load country object from source or from sample data.

Important

Before doing any database DML operation (Delete/Update/Insert) makes sure all under laying object is NULL

foreach (Country con in country)
{
   con.AirPorts =  null;
   con.FerriesTerminal  = null; 
}

I solved lots of error applying above for loop in my input objects.

Delete

using (var ctx = DBContext)
{
  using (var tc = new TransactionScope())
   {
      foreach (Country con in country)
      {
        //Mark con Object for Delete
        con.MarkAsDeleted();
        ctx.Country.Attach(con);
        //Delete data from Country Table
        ctx.Country.DeleteObject(con);
      }

    ctx.SaveChanges();
    tc.Complete();
  }
} 
Another Way of Delete

using (var ctx = DBContext)
{
    using (var tc = new TransactionScope())
    {
       foreach (Country con in country)
       {
          //Mark con Object for Delete
   con.MarkAsDeleted();
        //Delete data from Country Table
          ctx.Country.ApplyChanges(con);
       }

    ctx.SaveChanges();
    tc.Complete();
  }
} 
Update

using (var ctx = DBContext)
{
    using (var tc = new TransactionScope())
    {
       foreach (Country con in country)
       {
         //Mark Object as Modified
  con.MarkAsModified()
         //Update data into Country Table
         ctx.Country.ApplyChanges(con);
       }

    ctx.SaveChanges();
    tc.Complete();
  }
} 
Insert
           
using (var ctx = DBContext)
{
  using (var tc = new TransactionScope())
   {
      foreach (Country con in country)
      {
        //Insert data into Country Table
        ctx.Country.AddObject(con);
      }

    ctx.SaveChanges();
    tc.Complete();
  }
}

Note: I observed, sometime its take lots of time to figure out what the problem going on and what’s the solution, if it’s really taking so much time to solve the issues with entity framework then I would suggest to use STORED PROCEDURE for complex DML operations.