Pergunta

Parece que estou faltando alguma coisa sobre o LINQ.Para mim, parece que estou pegando alguns dos elementos do SQL que menos gosto e movendo-os para a linguagem C# e usando-os para outras coisas.

Quero dizer, pude ver o benefício de usar instruções do tipo SQL em outras coisas além de bancos de dados.Mas se eu quisesse escrever SQL, bem, por que não apenas escrever SQL e mantê-lo fora do C#?O que estou perdendo aqui?

Foi útil?

Solução

LINQ não é sobre SQL.LINQ trata de aplicar paradigmas de programação funcional em objetos.

LINQ to SQL é um ORM construído sobre a base LINQ, mas LINQ é muito mais.Não uso LINQ to SQL, mas uso LINQ o tempo todo.

Assuma a tarefa de encontrar a intersecção de duas listas:

Antes do LINQ, essa tarefa exigia escrever um foreach aninhado que itera a lista pequena uma vez para cada item na lista grande O(N*M) e ocupa cerca de 10 linhas de código.

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

Usando LINQ, ele faz a mesma coisa em uma linha de código:

var results = list1.Intersect(list2);

Você notará que não se parece com LINQ, mas é.Você não precisa usar a sintaxe da expressão se não quiser.

Outras dicas

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

Depois:

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

Portanto, o que realmente importa sobre o LINQ não tem nada a ver com o Linq to SQL.É sobre as melhorias que trouxe para a própria linguagem C#.

LINQ não é apenas um sistema ORM, como Jonathan apontou, ele traz muitos elementos de programação funcional para C#.E permite que você faça muitas coisas "de banco de dados" em código C# normal.É difícil explicar o quão incrivelmente poderoso isso pode ser.Considere o quanto ter estruturas de dados genéricas sólidas e bem projetadas (como lista, pilha, dicionário/hash, etc.) incluídas em estruturas comuns melhorou o estado de desenvolvimento em linguagens modernas.Precisamente porque o uso dessas estruturas de dados é muito comum e reduzir a sobrecarga intelectual de seu uso é um enorme benefício.O LINQ não faz nada que você não possa fazer sozinho, mas torna muitas operações muito mais diretas e fáceis.

Considere o exemplo consagrado de remoção de duplicatas de uma lista não ordenada.Em uma linguagem de nível inferior, como C ou C++, você provavelmente teria que classificar a lista e manter dois índices na lista ao remover os ingênuos.Em uma linguagem com hashes (Java, C#, Javascript, Perl, etc.), você pode criar um hash onde as chaves são os valores únicos e, em seguida, extrair as chaves em uma nova lista.Com o LINQ você poderia fazer isso:

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

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

Como o linq é na verdade mônadas em roupas sql, estou usando-o em um projeto para fazer solicitações web assíncronas com a mônada de continuação, e está provando funcionar muito bem!

Confira estes artigos: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

Do primeiro artigo:

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

A questão é que o LINQ integra suas consultas em sua linguagem de programação principal, permitindo que seu IDE forneça alguns recursos (Intellisense e suporte a depuração, por exemplo) que você não teria de outra forma, e permite que o compilador verifique o tipo de seu SQL. código (o que é impossível com uma consulta de string normal).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top