Pregunta

Parece que me falta algo sobre LINQ.Para mí, parece que se están tomando algunos de los elementos de SQL que menos me gustan y moviéndolos al lenguaje C# y usándolos para otras cosas.

Quiero decir, pude ver el beneficio de usar declaraciones similares a SQL en otras cosas además de las bases de datos.Pero si quisiera escribir SQL, bueno, ¿por qué no simplemente escribir SQL y mantenerlo fuera de C#?¿Que me estoy perdiendo aqui?

¿Fue útil?

Solución

LINQ no se trata de SQL.LINQ se trata de aplicar paradigmas de programación funcional a objetos.

LINQ to SQL es un ORM construido sobre la base de LINQ, pero LINQ es mucho más.No uso LINQ to SQL, pero uso LINQ todo el tiempo.

Tome la tarea de encontrar la intersección de dos listas:

Antes de LINQ, esta tarea requería escribir un foreach anidado que itera la lista pequeña una vez por cada elemento de la lista grande O(N*M) y requiere aproximadamente 10 líneas de código.

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

Usando LINQ, hace lo mismo en una línea de código:

var results = list1.Intersect(list2);

Notarás que no se parece a LINQ, pero lo es.No es necesario utilizar la sintaxis de expresión si no lo desea.

Otros consejos

Antes:

// 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

Despué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();

O alternativamente (sintaxis de consulta):

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();

Entonces, lo realmente importante de LINQ no tiene nada que ver con Linq to SQL.Se trata de las mejoras que aportó al propio lenguaje C#.

LINQ no es sólo un sistema ORM, como señaló Jonathan, aporta muchos elementos de programación funcionales a C#.Y le permite hacer muchas cosas de "base de datos" en código C# normal.Es difícil explicar cuán increíblemente poderoso puede ser eso.Considere cuánto ha mejorado el estado de desarrollo de los lenguajes modernos tener estructuras de datos genéricas sólidas y bien diseñadas (como lista, pila, diccionario/hash, etc.) incluidas en marcos comunes.Precisamente porque el uso de estas estructuras de datos es muy común y reducir la sobrecarga intelectual que supone su uso es un gran beneficio.LINQ no hace nada que usted no pueda hacer usted mismo, pero hace que muchas operaciones sean mucho más sencillas y sencillas.

Considere el ejemplo tradicional de eliminar duplicados de una lista no ordenada.En un lenguaje de nivel inferior como C o C++, probablemente tendría que ordenar la lista y mantener dos índices en la lista a medida que elimina los duplicados.En un lenguaje con hashes (Java, C#, Javascript, Perl, etc.), puede crear un hash donde las claves sean los valores únicos y luego extraer las claves en una nueva lista.Con LINQ podrías hacer esto:

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

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

Debido a que linq en realidad son mónadas en forma de SQL, lo estoy usando en un proyecto para realizar solicitudes web asincrónicas con la mónada de continuación, ¡y está demostrando que funciona muy bien!

Mira estos artículos: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

Del primer artículo:

    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();
        });
    }

El punto es que LINQ integra sus consultas en su lenguaje de programación principal, permitiendo que su IDE le brinde algunas funciones (Intellisense y soporte de depuración, por ejemplo) que de otro modo no tendría, y permitir que el compilador verifique el tipo de su SQL. código (lo cual es imposible con una consulta de cadena normal).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top