سؤال

يبدو أنني فقدت شيئا عن LINQ.بالنسبة لي, يبدو أنه أخذ بعض العناصر من SQL التي أحب الأقل والانتقال بها إلى لغة C# و استخدامها لأشياء أخرى.

يعني أنا يمكن أن نرى الفائدة من استخدام SQL-مثل البيانات على أمور أخرى من قواعد البيانات.ولكن إذا أردت أن أكتب SQL, حسنا, لماذا لا مجرد كتابة SQL والحفاظ عليه من C# ؟ ما أنا في عداد المفقودين هنا ؟

هل كانت مفيدة؟

المحلول

LINQ لا حول SQL.LINQ عن كونها تطبيق البرمجة الوظيفية paradigmns على الكائنات.

LINQ to SQL هو ORM بنيت ontop ينق الأساس ، ولكن LINQ هو أكثر من ذلك بكثير.أنا لا استخدام LINQ to SQL, بعد استخدام LINQ في كل وقت.

تأخذ مهمة العثور على تقاطع اثنين من القوائم:

قبل LINQ هذه المهام يتطلب كتابة متداخلة foreach أن تتكرر الصغيرة القائمة مرة واحدة لكل بند في قائمة كبيرة O(N*M) و يستغرق حوالي 10 أسطر من التعليمات البرمجية.

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

باستخدام LINQ يفعل الشيء نفسه في سطر واحد من التعليمات البرمجية:

var results = list1.Intersect(list2);

ستلاحظ أن لا يبدو LINQ بعد ذلك.أنت لا تحتاج إلى استخدام التعبير اللغوي إذا كنت لا تريد.

نصائح أخرى

قبل:

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

وبعد:

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

أو بدلا من ذلك (بناء جملة الاستعلام):

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

لذلك حقا صفقة كبيرة حول ينق له علاقة مع Linq to SQL.ولكن عن التحسينات انها جلبت الى لغة C# في حد ذاته.

LINQ ليست مجرد ORM نظام جوناثان وأشار إلى أنه يجلب الكثير من البرمجة الوظيفية العناصر إلى C#.ويتيح لك الكثير من "قاعدة بيانات-y" الأشياء العادية في التعليمات البرمجية C#.من الصعب شرح كيف قوية بشكل لا يصدق التي يمكن أن تكون.النظر في مدى وجود صلبة مصممة بشكل جيد عامة هياكل البيانات (مثل قائمة, كومة, قاموس/التجزئة ، إلخ.) المدرجة في أطر مشتركة تحسنت حالة التنمية في اللغات الحديثة.على وجه التحديد بسبب استخدام البيانات هذه الهياكل هو شائع جدا و تقليل الفكرية النفقات العامة من استخدامها هو فائدة كبيرة.LINQ لا تفعل أي شيء لا يمكنك القيام به نفسك ، ولكنه يجعل الكثير من العمليات الكثير أكثر وضوحا و أسهل كثيرا.

تنظر العريقة سبيل المثال إزالة التكرارات من غير أمر القائمة.في مستوى أقل اللغات مثل C أو C++ غالبا سيكون لديك لفرز القائمة والحفاظ على اثنين من المؤشرات في القائمة كما يمكنك إزالة المغفلين.في اللغة مع التجزئة (Java, C#, Javascript, Perl, الخ.) يمكنك إنشاء تجزئة أين هي القيم فريدة من نوعها ، ثم استخراج المفاتيح في القائمة الجديدة.مع LINQ يمكنك فقط القيام بذلك:

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

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

لأن linq هو حقا monads في sql الملابس, أنا استخدامه على مشروع لجعل غير متزامن طلبات ويب مع استمرار الكائن الدقيق الاحادي الخلية ، وانها تثبت أن تعمل بشكل جيد حقا!

تحقق من هذه المواد: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

من المادة الأولى:

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

وهذه النقطة هي أن ينق يدمج الاستفسارات الخاصة بك في الابتدائي لغة البرمجة ، مما يسمح IDE أن توفر لك مع بعض المرافق (التحسس وتصحيح الدعم ، على سبيل المثال) التي لولاها لم يكن ، والسماح مترجم إلى نوع-التحقق من التعليمات البرمجية SQL (وهو أمر مستحيل مع العادي سلسلة الاستعلام).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top