Monday, December 28, 2009

DataTable to Dictionary using LINQ

Sometimes we have to create generic dictionary from the values in datatable. Usually we will loop through all the rows in the datatable and add the relevant keys to dictionary object

for (int _iExRowCnt = 0; _iExRowCnt < dsReturn.Tables[0].Rows.Count; _iExRowCnt++){
//add some code to chek null values & other validations if any
_dictObj.Add(dsReturn.Tables[0].Rows[iExRowCnt][0].dsReturn.Tables[0].Rows[iExRowCnt][1]);
}

After LINQ was introduced there better way of doing the same addition.
In the following code i am creating a datatable and populaing few dummy records.

DataTable dtTable = new DataTable();dtTable.Columns.Add(new DataColumn("ColumnNo",typeof(System.String)));
dtTable.Columns.Add(
new DataColumn("controlType"typeof(System.String)));
dtTable.Columns.Add(
new DataColumn("showVal"typeof(System.Boolean)));

DataRow dr;
for (int i = 0; i < 10; i++)
{
dr = dtTable.NewRow();
dr[0] = dtTable.Rows.Count + 1;
dr[1] = i.ToString() + 
"Value";
dr[2] = 
false;
dtTable.Rows.Add(dr);
}
//In the following code I am using LINQ to create a new Dictionary<string,string>
//You can filter the data and checf for the conditions in data which you dont want in dictionary

var dic = (from order in dtTable.AsEnumerable()where order.Field<Boolean>("showVal") == false
select new
{
myColumnNo = order.Field<
String>("ColumnNo"),myControlType = order.Field<String>("controlType")}).AsEnumerable().ToDictionary(k => k.myColumnNo, v => v.myControlType);

This code snippet uses Enumerable.ToDictionary Method
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.todictionary.aspx
var dic will hold Dictionary<string,string> object. In the sample code it will have 10 elements
 For further reading

Saturday, December 26, 2009

Anonymous types for dummies

Anonymous types are used to define strong types without defining the type. Anonymous types are strongly typed and checked at compile time. It provides a convenient way to encapsulate a set of read-only properties into a single object without having to first explicitly define a type. Anonymous types are reference types that derive directly from object. The compiler gives them a name although your application cannot access it. From the perspective of the common language runtime, an anonymous type is no different from any other reference type, except that it cannot be cast to any type except for object. This type is widely used by LINQ, because LINQ returns dynamically-shaped data, whose type is determined by the LINQ query



To understand better look at the following code
static void Main(string[] args)
        {
               string[] names = { "Abhi1", "abhi", "abhi11",
                       "george", "bush", "britney",
                       "gandhi", "David" };

           
             IEnumerable<string> varAnnoyType = from str in names
                                         orderby str
                                         select str;

            //following code also valid
          //var varAnnoyType = from str in names
          //                               orderby str
          //                               select str;

             foreach (string strname in varAnnoyType)
                 Console.WriteLine(strname);


                    Console.ReadLine();
                                     
        }

anonymous type is an object which supports IEnumerable interface.

In the above example an array of names is created (took the array collection from msdn) , an IEnumerable<string> type is created, see the keyword like from used to iterate eact item in collection, orderby clause orders (without LINQ imagine the dictionaries , temp variables and other techniqies used to sort items now this is really cool). You can add a Where clause also before the select keyword. If any conditions are specified then select will retrieve only those items which satisfies the where clause.

  var varAnnoyType = from str in names
                                where str.StartsWith("abhi")
                                orderby str
                                select str;

The for each iteration can be written like the following also.
foreach (var strname in varAnnoyType)
                 Console.WriteLine(strname);

If two or more anonymous types have the same number and type of properties in the same order, the compiler treats them as the same type and they share the same compiler-generated type information.

An anonymous type has method scope. To pass an anonymous type, or a collection that contains anonymous types, outside a method boundary, you must first cast the type to object. However, this defeats the strong typing of the anonymous type. If you must store your query results or pass them outside the method boundary, consider using an ordinary named struct or class instead of an anonymous type.

Anonymous types cannot contain unsafe types as properties.

Because the Equals and GetHashCode methods on anonymous types are defined in terms of the Equals and GetHashcode of the properties, two instances of the same anonymous type are equal only if all their properties are equal.

LINQ for dummies - an overview


Why do we need LINQ?

Most of us would have wrote code to access data from different data sources a database, in memory objects , XML files or from other formats. We have different guidelines, architectures and methods to process and retrieve these data collection. For a data control in form it is immaterial whether the data is from XML or any other data sources. We have many relational OO databases but there always the gap between the data and its processing in Objects in any modern languages.


Is LINQ the Holy Grail?
I can’t decide on that. But LINQ tries to fill the vacuum between the datasources and their successful interpretation in Objects. With LINQ, Microsoft’s intention was to provide a solution for the problem of object-relational mapping, as well as to simplify the interaction between objects and data sources. LINQ eventually evolved into a general-purpose language-integrated querying toolset. This toolset can be used to access data coming from in-memory objects (LINQ to Objects), databases (LINQ to SQL), XML
documents (LINQ to XML), a file-system, or any other source.

LINQ can be used to access any type of object or datasource. The syntax remains the same. Previously we had to use different methods like ADO.Net.  XPath, IO packages etc to retrieve data ( ok still we can use these methods and in many cases I still prefer them over LINQ)

Broadly classifying we have three major categories of LINQ
  1. LINQ to Objects,
  2. LINQ to SQL,
  3. LINQ to XML

Don’t worry there are other categories like LINQ to datasets. LINQ to Entities ( with ADO.net entity framework). In Visual Studio you can write LINQ queries in Visual Basic or C# with SQL Server databases, XML documents, ADO.NET Datasets, and any collection of objects that supports IEnumerable or the generic IEnumerable(T) interface. In short .NET Language-Integrated Query defines a set of general purpose standard query operators that allow traversal, filter, and projection operations to be expressed in a direct yet declarative way in any .NET-based programming language. Third parties are also free to replace the standard query operators with their own implementations that provide additional services such as remote evaluation, query translation, optimization, and so on. By adhering to the conventions of the LINQ pattern, such implementations enjoy the same language integration and tool support as the standard query operators.

Next – LINQ in action ... 

Sunday, December 20, 2009

Difference between a constant and readonly variables/fields : (constant vs readonly)



Most of us would have encountered these questions

  • What is the difference between constant and readonly fields?
  • When to use constant and when to use readonly fields?
  • What is the advantage/disadvantage of each?

Constants
  • In C# you can declare a constant like this "const" is a keyword.
    public const string _constStrVar = "I am a static const str val";
  • A constant variable should have value at design time. 
  • All the constant variables are static ie they are shared across all the instances of the class. You dont have to add the keyword "static".
  • Constants are copied to all the dlls where is refereeing the parent class ie even if you change the the original constant value and recompile the parent dll , the other dll will still use the old value. The size of the executable goes up since all these constants are copied to the respective dlls

Read Only 

  • Read only variables are created usually in the constructor of class. there fore it will have values before the constructor of the class exists
    class MyClass
    {
        public readonly string _strReadonly;
        public void MyClass(string strVal)
            {            _strReadonly = strVal;
              }       
            }


        a read only variable will have different values for each object whereas a constant variable will have only one.

        Wednesday, December 2, 2009

        Return top N rows from datatable


        Normally to return top N rows we use an SQL statement similar to the one below

        Select top N * from table



        but How can we achieve the same thing in DataTable
        I have seen many examples, using different methods. Most of the methods centered around the idea of creating new columns with automatic values increment and using them as index 


        There is better method using LINQ