Question

Il me semble qu'il manque quelque chose à propos de LINQ.Pour moi, il semble que cela prenne certains des éléments de SQL que j'aime le moins et les déplace vers le langage C# et les utilise pour d'autres choses.

Je veux dire, je pouvais voir l'avantage d'utiliser des instructions de type SQL sur des choses autres que les bases de données.Mais si je voulais écrire du SQL, pourquoi ne pas simplement écrire du SQL et le conserver en dehors du C# ?Qu'est-ce que j'oublie ici?

Était-ce utile?

La solution

LINQ ne concerne pas SQL.LINQ consiste à appliquer des paradigmes de programmation fonctionnelle sur des objets.

LINQ to SQL est un ORM construit sur la fondation LINQ, mais LINQ est bien plus.Je n'utilise pas LINQ to SQL, mais j'utilise LINQ tout le temps.

Prenez la tâche de trouver l'intersection de deux listes :

Avant LINQ, cette tâche nécessite l'écriture d'un foreach imbriqué qui parcourt la petite liste une fois pour chaque élément de la grande liste O(N*M) et prend environ 10 lignes de code.

foreach (int number in list1)
{
    foreach (int number2 in list2)
    {
        if (number2 == number)
        {
            returnList.add(number2);
        }
    }
}

En utilisant LINQ, il fait la même chose sur une seule ligne de code :

var results = list1.Intersect(list2);

Vous remarquerez que cela ne ressemble pas à LINQ, et pourtant c'est le cas.Vous n'avez pas besoin d'utiliser la syntaxe de l'expression si vous ne le souhaitez pas.

Autres conseils

Avant:

// Init Movie
m_ImageArray = new Image[K_NB_IMAGE];

Stream l_ImageStream = null;
Bitmap l_Bitmap = null;

// get a reference to the current assembly
Assembly l_Assembly = Assembly.GetExecutingAssembly();

// get a list of resource names from the manifest
string[] l_ResourceName = l_Assembly.GetManifestResourceNames();

foreach (string l_Str in l_ResourceName)
{
    if (l_Str.EndsWith(".png"))
    {
        // attach to stream to the resource in the manifest
        l_ImageStream = l_Assembly.GetManifestResourceStream(l_Str);
        if (!(null == l_ImageStream))
        {
            // create a new bitmap from this stream and 
            // add it to the arraylist
            l_Bitmap = Bitmap.FromStream(l_ImageStream) as Bitmap;
            if (!(null == l_Bitmap))
            {
                int l_Index = Convert.ToInt32(l_Str.Substring(l_Str.Length - 6, 2));
                l_Index -= 1;
                if (l_Index < 0) l_Index = 0;
                if (l_Index > K_NB_IMAGE) l_Index = K_NB_IMAGE;
                m_ImageArray[l_Index] = l_Bitmap;
            }
            l_Bitmap = null;
            l_ImageStream.Close();
            l_ImageStream = null;
        } // if
    } // if
} // foreach

Après:

Assembly l_Assembly = Assembly.GetExecutingAssembly();

//Linq is the tops
m_ImageList = l_Assembly.GetManifestResourceNames()
    .Where(a => a.EndsWith(".png"))
    .OrderBy(b => b)
    .Select(c => l_Assembly.GetManifestResourceStream(c))
    .Where(d => d != null)  //ImageStream not null
    .Select(e => Bitmap.FromStream(e))
    .Where(f => f != null)  //Bitmap not null
    .ToList();

Ou bien (syntaxe de requête):

Assembly l_Assembly = Assembly.GetExecutingAssembly();

//Linq is the tops
m_ImageList = (
    from resource in l_Assembly.GetManifestResourceNames()
    where resource.EndsWith(".png")
    orderby resource
    let imageStream = l_Assembly.GetManifestResourceStream(resource)
    where imageStream != null
    let bitmap = Bitmap.FromStream(imageStream)
    where bitmap != null)
    .ToList();

Donc, le très gros problème à propos de LINQ n'a rien à voir avec Linq to SQL.Il s'agit des améliorations apportées au langage C# lui-même.

LINQ n'est pas seulement un système ORM, comme Jonathan l'a souligné, il apporte de nombreux éléments de programmation fonctionnels à C#.Et cela vous permet de faire beaucoup de choses "base de données" dans du code C# standard.Il est difficile d’expliquer à quel point cela peut être incroyablement puissant.Considérez à quel point le fait d'avoir des structures de données génériques solides et bien conçues (telles que liste, pile, dictionnaire/hachage, etc.) incluses dans des cadres communs a amélioré l'état de développement des langues modernes.Précisément parce que l’utilisation de ces structures de données est très courante et que réduire la charge intellectuelle liée à leur utilisation constitue un énorme avantage.LINQ ne fait rien que vous ne puissiez faire vous-même, mais il rend de nombreuses opérations beaucoup plus simples et beaucoup plus faciles.

Prenons l'exemple traditionnel de la suppression des doublons d'une liste non ordonnée.Dans un langage de niveau inférieur comme C ou C++, vous devrez probablement trier la liste et conserver deux index dans la liste lorsque vous supprimez les dupes.Dans un langage avec des hachages (Java, C#, Javascript, Perl, etc.), vous pouvez créer un hachage où les clés sont les valeurs uniques, puis extraire les clés dans une nouvelle liste.Avec LINQ, vous pouvez simplement faire ceci :

int[] data = { 0, 1, 3, 3, 7, 8, 0, 9, 2, 1 };

var uniqueData = data.GroupBy(i => i).Select(g => g.Key);

Parce que Linq est vraiment une monade dans les vêtements SQL, je l'utilise sur un projet pour faire des requêtes Web asynchrones avec la monade de continuation, et cela s'avère très bien fonctionner !

Consultez ces articles :http://www.aboutcode.net/2008/01/14/Async+WebRequest+Using+LINQ+Syntax.aspx http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx

Dès le premier article :

    var requests = new[] 
    {
        WebRequest.Create("http://www.google.com/"),
        WebRequest.Create("http://www.yahoo.com/"),
        WebRequest.Create("http://channel9.msdn.com/")
    };

    var pages = from request in requests
                select
                    from response in request.GetResponseAsync()
                    let stream = response.GetResponseStream()
                    from html in stream.ReadToEndAsync()
                    select new { html, response };

    foreach (var page in pages)
    {
        page(d =>
        {
            Console.WriteLine(d.response.ResponseUri.ToString());
            Console.WriteLine(d.html.Substring(0, 40));
            Console.WriteLine();
        });
    }

Le fait est que LINQ intègre vos requêtes dans votre langage de programmation principal, permettant à votre IDE de vous fournir certaines fonctionnalités (prise en charge d'Intellisense et du débogage, par exemple) que vous n'auriez pas autrement, et de permettre au compilateur de vérifier votre type SQL. code (ce qui est impossible avec une requête de chaîne normale).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top