ลักษณะที่ยากที่สุดหรือเข้าใจผิดมากที่สุดของ LINQ คืออะไร [ปิด]


282

พื้นหลัง: กว่าเดือนต่อไปผมจะให้พูดคุยเกี่ยวกับสามหรืออย่างน้อยรวมทั้งในบริบทของLINQ C#ฉันต้องการทราบว่าหัวข้อใดที่ควรให้ความสนใจอย่างยุติธรรมโดยพิจารณาจากสิ่งที่ผู้คนอาจเข้าใจยากหรือสิ่งที่พวกเขาอาจรู้สึกผิด ฉันจะไม่พูดLINQถึงSQLหรือ Entity Framework โดยเฉพาะยกเว้นเป็นตัวอย่างของวิธีการสืบค้นข้อมูลที่สามารถดำเนินการจากระยะไกลโดยใช้แผนผังต้นไม้ (และปกติIQueryable)

แล้วคุณพบLINQอะไรที่หนักหนาสาหัส คุณเห็นอะไรในแง่ของความเข้าใจผิด? ตัวอย่างอาจมีข้อใดข้อหนึ่งต่อไปนี้ แต่โปรดอย่า จำกัด ตัวเอง!

  • วิธีC#การปฏิบัติเรียบเรียงแบบสอบถามการแสดงออก
  • นิพจน์แลมบ์ดา
  • ต้นไม้แสดงออก
  • วิธีการขยาย
  • ประเภทนิรนาม
  • IQueryable
  • รอการตัดบัญชีเทียบกับการดำเนินการทันที
  • สตรีมมิ่ง vs การประมวลผลบัฟเฟอร์ (เช่น OrderBy ถูกเลื่อนออกไป แต่บัฟเฟอร์)
  • พิมพ์ตัวแปรโลคัลโดยปริยาย
  • การอ่านลายเซ็นทั่วไปที่ซับซ้อน (เช่นEnumerable.Join )

3
ฉันจะสนใจที่จะรู้ว่าเมื่อใดที่คุณจะทำการเจรจาเหล่านี้และหากมีวิธีใดที่จะสามารถดูพวกเขาออนไลน์ได้
Mark Heath

2
การพูดคุยครั้งแรก: โคเปนเฮเกน, 30 ตุลาคม หวังว่านี่จะถูกบันทึกเทป (ทั้งวัน!) การพูดคุยครั้งที่สอง: ลอนดอน 19 พ.ย. ในตอนเย็นกลุ่มผู้ใช้งาน. NET ลอนดอน การพูดคุยครั้งที่สาม: การอ่านวันที่ 22 พ.ย. วันนักพัฒนาซอฟต์แวร์ใช้งาน LINQ กับวัตถุใน 60 นาที
Jon Skeet

1
Downvoters: โปรดเพิ่มความคิดเห็นที่อธิบาย
Jon Skeet

2
@ จอนขอโทษด้วย แต่ฉันต้องปิดนี่สิ
Tim Post

3
@Tim: ยุติธรรมเพียงพอ - มันไม่ได้รับคำตอบอีกแล้ว ส่วนตัวผมคิดว่ามันไม่ได้จบลงด้วยการสร้างสรรค์ใจคุณ - แน่นอนผมพบว่ามันมีประโยชน์ที่จะเห็นสิ่งที่คนพบหากิน ฉันอาจจะไม่ได้ถามตอนนี้แม้ว่า ...
Jon Skeet

คำตอบ:


271

การดำเนินการล่าช้า


12
Righto - นี่เป็นที่ชื่นชอบอย่างชัดเจนในหมู่ผู้อ่านซึ่งเป็นสิ่งที่สำคัญที่สุดสำหรับคำถามนี้ ฉันจะเพิ่ม "การบัฟเฟอร์ vs การสตรีม" ลงในมิกซ์ด้วยเช่นกันที่เกี่ยวข้องอย่างใกล้ชิดและมักจะไม่ได้กล่าวถึงในรายละเอียดเท่าที่ฉันต้องการจะดูในหนังสือ
Jon Skeet

10
จริงๆ? ฉันมีธรรมชาติที่ขี้เกียจชี้ไปที่ฉันหลายครั้งในขณะที่เรียนรู้ Linq มันไม่เคยเป็นปัญหาสำหรับฉันเลย
Adam Lassek

26
เห็นด้วยกับ ALassek เอกสาร MSDN ระบุลักษณะการประเมินที่ขี้เกียจของ LINQ อย่างชัดเจน บางทีปัญหาที่แท้จริงคือลักษณะการเขียนโปรแกรมขี้เกียจของนักพัฒนา ... =)
Seiti

4
... โดยเฉพาะอย่างยิ่งเมื่อคุณตระหนักว่ามันใช้กับ LINQ กับวัตถุและไม่ใช่แค่ LINQ 2 SQL - เมื่อคุณเห็นวิธีการทางเว็บ 10 รายการเพื่อเรียกรายการของรายการเมื่อคุณระบุผ่านรายการเดียวกันและคุณคิดว่า รายการได้รับการประเมินแล้ว
Simon_Weaver

5
การรู้ว่าคำแถลงเรื่องผลตอบแทนคืออะไรและทำงานอย่างไร IMHO มีความสำคัญอย่างยิ่งต่อการทำความเข้าใจ LINQ อย่างถี่ถ้วน
peSHIr

125

ฉันรู้ว่าแนวคิดการดำเนินการที่เลื่อนออกไปควรจะพ่ายแพ้ต่อฉันในตอนนี้ แต่ตัวอย่างนี้ช่วยให้ฉันเข้าใจได้จริง:

static void Linq_Deferred_Execution_Demo()
{
    List<String> items = new List<string> { "Bob", "Alice", "Trent" };

    var results = from s in items select s;

    Console.WriteLine("Before add:");
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }

    items.Add("Mallory");

    //
    //  Enumerating the results again will return the new item, even
    //  though we did not re-assign the Linq expression to it!
    //

    Console.WriteLine("\nAfter add:");
    foreach (var result in results)
    {
        Console.WriteLine(result);
    }
}

โค้ดด้านบนส่งคืนค่าต่อไปนี้:

Before add:
Bob
Alice
Trent

After add:
Bob
Alice
Trent
Mallory

2
blogs.msdn.com/b/charlie/archive/2007/12/09/… <- ฉันคิดว่านี่เป็นบล็อกที่ดีที่สุดในการอธิบายในความคิดเห็นของฉัน (ไกลออกไปปี 2007 ไม่น่าเชื่อเลยว่ามันจะมีมานานแล้ว)
Phill

104

ว่ามีมากขึ้นกว่าเพียงแค่LINQการSQLและคุณสมบัติที่มีมากกว่าเพียงแค่SQLparser ฝังตัวอยู่ในภาษา


6
ฉันเบื่อทุกคนที่คิดว่า: /
TraumaPony

40
ไม่ใช่ทุกคนที่ทำ! ฉันยังไม่รู้ว่า LINQ กับ SQL คืออะไรและฉันใช้ LINQ ตลอดเวลาแช่ง
Robert Rossney

2
ฉันรำคาญมากเมื่อฉันพยายามอธิบายบางสิ่งโดยใช้ LINQ และอีกคนเพียงแค่มองมาที่ฉันและพูดว่า "โอ้ฉันไม่ได้ใช้ LINQ เพื่ออะไรอย่างนั้น SQL เท่านั้น" :(
Nathan W

13
ตกลงหลายคนดูเหมือนจะไม่เข้าใจว่า LINQ เป็นเครื่องมืออเนกประสงค์
Matthew Olenik

86

สัญกรณ์ Big O LINQ ทำให้มันง่ายในการเขียนอัลกอริทึม O (n ^ 4) อย่างไม่น่าเชื่อหากคุณไม่รู้ว่าคุณกำลังทำอะไรอยู่


16
ตัวอย่างเป็นอย่างไร
hughdbrown

4
ตามตัวอย่างเขาอาจหมายถึงความจริงที่ว่ามันง่ายมากที่จะเลือก Select clause จะมีตัวดำเนินการ Sum () จำนวนมากที่แต่ละตัวดำเนินการทำให้เกิดการส่งผ่านชุดระเบียนทั้งหมดอีกครั้ง
Rob Packwood

1
ในความเป็นจริงมันอาจคุ้มค่าที่จะผ่านสัญกรณ์ O ขนาดใหญ่และทำไมมันถึงมีความสำคัญเช่นเดียวกับตัวอย่างของข้อความค้นหาที่ไม่มีประสิทธิภาพ ฉันคิดว่านั่นคือสิ่งที่โปสเตอร์ดั้งเดิมแนะนำ แต่ฉันคิดว่าฉันจะพูดถึงมันต่อไป - แก้ไข: เพิ่งรู้ว่าโพสต์นี้มีอายุ 1.5 ปี :-)
zcrar70

7
นั่นจะไม่ใช่ O (n ^ x), นั่นก็คือ O (xn), ซึ่งก็แค่ O (n)
Malfist

3
การพยายามเข้าร่วมโดยไม่มีโอเปอเรเตอร์การรวมจะทำให้ O (n ^ x): จาก i1 ใน range1 จาก i2 ใน range2 จาก i3 ใน range3 จาก i4 ใน range4 โดยที่ i1 == i2 && i3 == i4 เลือกใหม่ {i1, i2, i3, i4} และฉันเคยเห็นสิ่งนี้เขียนมาก่อน มันใช้งานได้ แต่ช้ามาก
MarkPflug

55

ฉันคิดว่าความจริงที่ว่าLambdaนิพจน์สามารถแก้ไขทั้งต้นไม้นิพจน์และผู้รับมอบสิทธิ์ที่ไม่ระบุชื่อดังนั้นคุณสามารถส่งlambdaนิพจน์ที่เหมือนกันประกาศไปยังIEnumerable<T>วิธีการIQueryable<T>ขยายและวิธีการขยาย


2
ตกลง ฉันเป็นทหารผ่านศึกและฉันเพิ่งรู้ว่าการคัดเลือกโดยนัยนี้เกิดขึ้นเมื่อฉันเริ่มเขียน QueryProvider ของฉันเอง
TheSoftwareJedi

53

เอาฉันวิธีนานเกินไปที่จะรู้ว่าหลายวิธีการขยาย LINQ เช่นSingle(), SingleOrDefault()ฯลฯ มี overloads ที่ใช้ lambdas

คุณทำได้ :

Single(x => x.id == id)

และไม่จำเป็นต้องพูดสิ่งนี้ - ซึ่งการสอนที่ไม่ดีบางอย่างทำให้ฉันติดนิสัย

Where(x => x.id == id).Single()

+1 ดีมาก ฉันจะเก็บไว้ในใจ
Pretzel

4
ฉันลืมสิ่งนี้ไปเรื่อย ๆ เช่นกัน มันก็เป็นความจริงCount()เช่นกัน คุณรู้หรือไม่ว่ามีความแตกต่างของประสิทธิภาพใด ๆ นอกเหนือจากโบนัสที่ชัดเจนของการอ่านโค้ด?
Justin Morgan

1
ที่มหาวิทยาลัยอาจารย์ของฉันต้องการถอดคะแนนเพื่อใช้งานเกินพิกัดเหล่านี้ !! ฉันพิสูจน์ว่าเขาผิด!
TDaver

12
อาจฟังดูแปลก แต่ฉันชอบไวยากรณ์ที่สอง ฉันพบว่าอ่านได้มากขึ้น
Konamiman

40

ใน LINQ ไปยัง SQL ฉันเห็นคนที่ไม่เข้าใจ DataContext อย่างต่อเนื่องว่าจะใช้อย่างไรและควรใช้อย่างไร มีคนจำนวนมากที่ไม่เห็น DataContext สำหรับสิ่งที่เป็นหน่วยของงานวัตถุไม่ใช่วัตถุแบบถาวร

ฉันได้เห็นหลายครั้งที่ผู้คนพยายามที่จะเป็นหนึ่งเดียว DataContext / เซสชันมัน / ฯลฯ แทนที่จะทำเวลาใหม่สำหรับการดำเนินการแต่ละครั้ง

จากนั้นก็มีการทิ้ง DataContext ก่อนที่ IQueryable จะได้รับการประเมิน แต่นั่นก็เป็นเรื่องที่สมบูรณ์แบบสำหรับคนที่ไม่เข้าใจ IQueryable มากกว่า DataContext

แนวคิดอื่นที่ฉันเห็นความสับสนเป็นจำนวนมากคือ Query Syntax และ Expression Syntax ฉันจะใช้สิ่งที่ง่ายที่สุด ณ จุดนั้นซึ่งมักจะติดกับ Expression Syntax ผู้คนจำนวนมากยังไม่รู้ว่าพวกเขาจะสร้างสิ่งเดียวกันในตอนท้ายแบบสอบถามจะรวบรวมเป็น Expression หลังจากทั้งหมด


2
คำเตือน: หน่วยงานสามารถเป็นโปรแกรมขนาดเล็กที่มีบริบทข้อมูลเป็นแบบซิงเกิล
graffic

15
คุณไม่ควรใช้ DataContext ในซิงเกิลตันมันไม่ปลอดภัย
Aaron Powell

3
@Slace โปรแกรมไม่ได้ทั้งหมดจะถูก multitheaded ดังนั้นจึงมีการตกลงที่จะมี DataContext เป็นเดี่ยวในจำนวนมากของ "เดสก์ทอป" ซอฟแวร์
เอียน Ringrose

2
ฉันถูกกัดโดยสิ่งนี้ (ใช้ DataContext เป็นซิงเกิล) เมื่อฉันทำ LINQ แรกไปยังโครงการ SQL ฉันไม่คิดว่าเอกสารและหนังสือมีความชัดเจนเพียงพอ อันที่จริงฉันคิดว่าชื่อน่าจะดีขึ้น แต่ฉันก็ไม่แน่ใจ
Roger Lipscombe

1
มันต้องอ่านบทความของ ScottGu ใน Linq หลายครั้งเพื่อที่จะได้รับสิ่งนี้ในหัวของฉัน
Evan Plaice

34

ผมคิดว่าส่วนหนึ่งเข้าใจผิดของ LINQ ก็คือว่ามันเป็นส่วนขยายของภาษาไม่ได้ขยายฐานข้อมูลหรือสร้าง

LINQเป็นมากกว่าLINQ to SQLนั้นอีกแล้ว

ตอนนี้พวกเราส่วนใหญ่เคยใช้LINQคอลเลคชั่นเราจะไม่กลับไป!

LINQ เป็นคุณลักษณะที่สำคัญที่สุดอย่างเดียวของ. NET ตั้งแต่ Generics ใน 2.0 และ Anonymous Type ใน 3.0

และตอนนี้เรามีแลมบ์ดาฉันไม่สามารถรอการเขียนโปรแกรมแบบขนาน!


ฉันจะเรียกมันว่าสำคัญกว่าประเภทนิรนามและอาจมากกว่า generics
Justin Morgan

26

ฉันคนหนึ่งอยากจะรู้ว่าถ้าฉันต้องรู้ว่าต้นไม้แสดงออกคืออะไรและทำไม


6
ฉันคิดว่ามันคุ้มค่าที่จะรู้ว่าต้นไม้แสดงออกคืออะไรและทำไมจึงมีอยู่ แต่ไม่ใช่รายละเอียดของวิธีการสร้างต้นไม้ด้วยตนเอง (มันเป็นความเจ็บปวดในการสร้างด้วยมือ แต่คอมไพเลอร์จะทำหน้าที่ได้ดีเมื่อแปลงแลมบ์ดา)
Jon Skeet

3
ที่จริงแล้วฉันกำลังคิดที่จะทำบล็อกสองสามรายการบนต้นไม้แสดงออก (เนื่องจากฉัน "รับ" พวกเขา) ผมพบว่าการจัดการกับต้นไม้การแสดงออกที่มีประโยชน์มาก ...
Marc Gravell

อย่างไรก็ตามฉันไม่คิดว่าพวกเขาจะมีประโยชน์สำหรับการพูดคุยของจอน ;-p
Marc Gravell

3
ฉันแค่กังวลว่าต้นไม้ที่แสดงออกจะเป็นเหมือนแถลงการณ์ผลผลิต: สิ่งที่กลายเป็นสิ่งที่มีค่าอย่างไม่น่าเชื่อแม้ว่าฉันจะไม่เข้าใจว่ามันเป็นอะไรในตอนแรก
Robert Rossney

1
Marc Gravell ฉันชอบอ่านบล็อกของคุณในหัวข้อ มองไปข้างหน้ามัน
Alexandre Brisebois

20

ฉันค่อนข้างใหม่กับ LINQ นี่คือสิ่งที่ฉันสะดุดในความพยายามครั้งแรกของฉัน

  • การรวมหลายแบบสอบถามเป็นหนึ่งเดียว
  • การดีบักการสอบถาม LINQ อย่างมีประสิทธิภาพใน Visual Studio

21
การดีบัก LINQ เป็นหัวข้อทั้งหมดด้วยตัวเองและเป็นหัวข้อที่สำคัญ ฉันคิดว่าจุดอ่อนที่ยิ่งใหญ่ที่สุดของ LINQ คือมันช่วยให้คุณเขียนบล็อกของตรรกะที่ซับซ้อนโดยพลการที่คุณไม่สามารถผ่านได้
Robert Rossney

3
เหล่านี้อาจจะเป็นสถานที่ที่ดีที่จะใช้แผ่น LINQ
Maslow

2
เห็นด้วยอย่างเต็มที่; นั่นเป็นเหตุผลที่ฉันเขียนความลับ LINQ เปิดเผย: การผูกมัดและการดีบักเผยแพร่เพียงบน Simple-Talk.com เพื่อให้คุณอาจได้รับความช่วยเหลือ
Michael Sorens

ใช่ LinqPad เป็นเครื่องมือรองที่ยอดเยี่ยมสำหรับการพัฒนาการสืบค้น LINQ ของคุณโดยเฉพาะอย่างยิ่งเมื่อเริ่มต้นและคุณยังใหม่กับอนุสัญญา / รูปแบบ
บัฟฟาโล่

20

สิ่งที่ฉันไม่ได้ตระหนักในตอนแรกก็คือว่าไวยากรณ์ LINQ ไม่ต้องการIEnumerable<T>หรือIQueryable<T>ทำงานได้ LINQ เป็นเพียงการจับคู่รูปแบบ

alt text http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png

นี่คือคำตอบ (ไม่ฉันไม่ได้เขียนบล็อกนั้น Bart De Smet ทำและเขาเป็นหนึ่งในนักเขียนบล็อกที่ดีที่สุดใน LINQ ที่ฉันพบ)


1
คุณอาจพบว่าโพสต์บล็อกนี้น่าสนใจเช่นกัน: msmvps.com/blogs/jon_skeet/archive/2008/02/29/…
Jon Skeet

Nice post Jon (ฉันสมัครรับข้อมูลบล็อกของคุณเมื่อไม่นานมานี้)
Aaron Powell

19

ฉันยังคงมีปัญหากับคำสั่ง "let" (ซึ่งฉันไม่เคยพบใช้มาก่อน) และ SelectMany (ซึ่งฉันเคยใช้ แต่ไม่แน่ใจว่าฉันทำถูกต้องแล้ว)


2
เมื่อใดก็ตามที่คุณต้องการแนะนำตัวแปรคุณจะใช้คำสั่ง let นึกถึงลูปดั้งเดิมที่คุณแนะนำตัวแปรภายในและตั้งชื่อตัวแปรแต่ละตัวเพื่อช่วยให้สามารถอ่านโค้ดได้ บางครั้งมันก็ดีที่คุณมีคำสั่งให้ประเมินผลฟังก์ชั่นซึ่งคุณสามารถเลือกและสั่งซื้อโดยเปิดโดยไม่ต้องประเมินผลสองครั้ง
Rob Packwood

'let' อนุญาตให้คุณทำประเภทคอมโพสิต สิ่งที่มีประโยชน์
Phill

19

ทำความเข้าใจเมื่อสิ่งที่เป็นนามธรรมในหมู่ผู้ให้บริการ Linq รั่วไหล บางสิ่งทำงานบนวัตถุ แต่ไม่ใช่ SQL (เช่น. TakeWhile) วิธีการบางอย่างสามารถแปลเป็น SQL (ToUpper) ในขณะที่วิธีอื่นไม่สามารถทำได้ เทคนิคบางอย่างมีประสิทธิภาพมากขึ้นในวัตถุที่คนอื่นมีประสิทธิภาพมากขึ้นใน SQL (วิธีการเข้าร่วมที่แตกต่างกัน)


1
นี่เป็นจุดที่ดีมาก มันไม่ได้ช่วยให้ Intellisense แสดงให้คุณเห็นทุกอย่างและมันมักจะคอมไพล์ จากนั้นคุณระเบิดที่รันไทม์ ฉันหวังว่า VS 2010 จะทำงานได้ดีขึ้นในการแสดงวิธีการขยายที่เกี่ยวข้อง
34499 Jason สั้นสั้นที่

12

สองสิ่ง

  1. คนที่คิดถึง Linq ว่า Linq ถึง SQL
  2. บางคนคิดว่าพวกเขาสามารถเริ่มแทนที่ foreach / logic ทั้งหมดด้วยการสืบค้น Linq โดยไม่คำนึงถึงผลการปฏิบัติงานนี้

11

ตกลงเนื่องจากความต้องการฉันได้เขียนรายการของ Expression ฉันไม่พอใจ 100% กับวิธีที่ blogger และ LiveWriter สมคบกันในการจัดรูปแบบ แต่ตอนนี้มันจะทำ ...

อย่างไรก็ตามนี่ไป ... ฉันชอบความคิดเห็นใด ๆ โดยเฉพาะถ้ามีพื้นที่ที่ผู้คนต้องการข้อมูลเพิ่มเติม

ที่นี่มันคือชอบหรือเกลียดมัน ...


10

ข้อความแสดงข้อผิดพลาดบางอย่างโดยเฉพาะจาก LINQ ไปยัง SQL อาจทำให้สับสนได้ การยิ้มกว้าง

ฉันถูกกัดโดยการดำเนินการรอการตัดบัญชีสองครั้งเหมือนคนอื่น ๆ ฉันคิดว่าสิ่งที่สับสนที่สุดสำหรับฉันคือ SQL Server Query Provider และสิ่งที่คุณทำได้และไม่สามารถทำได้

ฉันยังคงประหลาดใจกับความจริงที่ว่าคุณไม่สามารถทำ Sum () ในคอลัมน์ทศนิยม / เงินซึ่งบางครั้งว่างเปล่า ใช้ DefaultIfEmpty () เพียงใช้งานไม่ได้ :(


1
shold จะ prette เรื่องง่ายที่จะตบไหนในแบบสอบถามที่การทำงานทำให้ผลรวม
Esben Skov Pedersen

9

ฉันคิดว่าสิ่งที่ดีที่จะครอบคลุมใน LINQ คือวิธีที่คุณจะได้รับตัวเองในปัญหาประสิทธิภาพฉลาด ตัวอย่างเช่นการใช้การนับของ LINQ เป็นเงื่อนไขลูปไม่ใช่สมาร์ทจริงๆ


7

IQueryable นั้นยอมรับทั้งExpression<Func<T1, T2, T3, ...>>และFunc<T1, T2, T3, ...>โดยไม่ให้คำแนะนำเกี่ยวกับการเสื่อมประสิทธิภาพในกรณีที่ 2

นี่คือตัวอย่างรหัสที่แสดงให้เห็นถึงสิ่งที่ฉันหมายถึง:

[TestMethod]
public void QueryComplexityTest()
{
    var users = _dataContext.Users;

    Func<User, bool>                funcSelector =       q => q.UserName.StartsWith("Test");
    Expression<Func<User, bool>>    expressionSelector = q => q.UserName.StartsWith("Test");

    // Returns IEnumerable, and do filtering of data on client-side
    IQueryable<User> func = users.Where(funcSelector).AsQueryable();
    // Returns IQuerible and do filtering of data on server side
    // SELECT ... FROM [dbo].[User] AS [t0] WHERE [t0].[user_name] LIKE @p0
    IQueryable<User> exp = users.Where(expressionSelector);
}

คุณสามารถอธิบาย? ฉันไม่ได้ติดตาม ...
เซล

@Pretzel ฉันได้เพิ่มตัวอย่างรหัสซึ่งแสดงให้เห็นถึงปัญหาของฉัน
Valera Kolupaev

ขอบคุณสำหรับตัวอย่างรหัส! มีประโยชน์มาก
บัฟฟาโล่

6

ฉันไม่รู้ว่ามันมีคุณสมบัติเข้าใจผิดหรือไม่ แต่สำหรับฉัน

ฉันยินดีที่ได้เรียนรู้เกี่ยวกับ DataLoadOptions และฉันจะควบคุมว่าตารางใดบ้างที่จะเข้าร่วมเมื่อฉันทำการสืบค้นเฉพาะ

ดูที่นี่สำหรับข้อมูลเพิ่มเติม: MSDN: DataLoadOptions


6

ฉันจะบอกว่ามุมมองที่ผิดพลาดมากที่สุด (หรือไม่ควรเข้าใจ?) ของ LINQ คือ IQueryableและผู้ให้บริการ LINQ ที่กำหนดเองกำหนดเองผู้ให้บริการ

ฉันใช้ LINQ มาระยะหนึ่งแล้วและรู้สึกสะดวกสบายในโลก IEnumerable และสามารถแก้ปัญหาส่วนใหญ่ด้วย LINQ

แต่เมื่อฉันเริ่มดูและอ่านเกี่ยวกับ IQueryable และ Expressions และผู้ให้บริการ linq แบบกำหนดเองมันทำให้หัวของฉันหมุน ดูว่า LINQ กับ SQL ทำงานอย่างไรถ้าคุณต้องการดูตรรกะที่ซับซ้อน

ฉันหวังว่าจะเข้าใจลักษณะของ LINQ ...


6

อย่างที่คนส่วนใหญ่พูดว่าฉันคิดว่าส่วนที่เข้าใจผิดมากที่สุดคือสมมติว่า LINQ เป็นเพียงการแทนที่ T-SQL ผู้จัดการของฉันที่คิดว่าตัวเองเป็นกูรู TSQL จะไม่ให้พวกเราใช้ LINQ ในโครงการของเราและแม้แต่เกลียด MS ในการปล่อยเรื่องนี้ !!!


มีคนจำนวนมากใช้แทน TSQL ส่วนใหญ่ไม่เคยได้ยินแผนการดำเนินการ
erikkallen

+1 เพราะฉันเห็นด้วยกับผู้จัดการของคุณอย่างน้อยที่สุดเท่าที่อนุญาต LINQ ไปยัง SQL ในโครงการใด ๆ LINQ to Objects เป็นอีกเรื่องหนึ่งโดยสิ้นเชิง
NotMe

5

var แสดงถึงอะไรเมื่อดำเนินการสืบค้น

ใช่ไหม iQueryable , iSingleResult, iMultipleResult, หรือไม่ก็เปลี่ยนขึ้นอยู่กับการดำเนินการ มีการคาดเดาบางอย่างเกี่ยวกับการใช้ (สิ่งที่ดูเหมือนจะเป็น) การพิมพ์แบบไดนามิกและการพิมพ์แบบคงที่มาตรฐานใน C #


AFAIK var เป็นคลาสที่เป็นรูปธรรมเสมอ (แม้ว่าจะเป็นแบบไม่ระบุชื่อ) ดังนั้นมันจึงไม่มี IQueryable, ISingleResult หรืออะไรก็ตามที่ขึ้นต้นด้วย 'I' (คลาสคอนกรีตที่เริ่มต้นด้วย 'I' ไม่จำเป็นต้องสมัคร)
Motti

5

วิธีง่ายๆในการซ้อนวนเป็นสิ่งที่ฉันไม่คิดว่าทุกคนเข้าใจ

ตัวอย่างเช่น:

from outerloopitem in outerloopitems
from innerloopitem in outerloopitem.childitems
select outerloopitem, innerloopitem

+1, ว้าว มันค่อนข้างทรงพลัง
Pretzel

4

group by ยังทำให้หัวของฉันหมุน

ความสับสนเกี่ยวกับการดำเนินการรอการตัดบัญชีควรสามารถแก้ไขได้ด้วยการใช้รหัส LINQ ที่ใช้งานง่ายและเล่นในหน้าต่างดู


1
ฉันพบว่าการนำ LINQ ไปใช้กับ Objects เพื่อความสนุกช่วยได้มาก แต่ก็ใช่ว่ามันจะสับสนนิดหน่อย - แน่นอนว่าถ้าฉันยังไม่ได้ทำ LINQ สักพักฉันต้องกลับไปที่ลายเซ็น ในทำนองเดียวกัน "เข้าร่วม" VS "เข้าร่วมเข้า" มักจะได้รับฉัน ...
จอนสกีต

4

รวบรวมคำค้นหา

ความจริงที่ว่าคุณไม่สามารถเชื่อมโยง IQueryableเนื่องจากพวกเขาเรียกวิธีการ (ในขณะที่ยังไม่มีอะไรอื่นนอกจาก SQL แปลได้!) และเป็นไปไม่ได้ที่จะหลีกเลี่ยงปัญหานี้ก็คือการสร้างความกังวลและสร้างการละเมิด DRY ฉันต้องการของฉันIQueryableสำหรับเฉพาะกิจซึ่งฉันไม่ได้รวบรวมแบบสอบถาม (ฉันมีเพียงแบบสอบถามรวบรวมสำหรับสถานการณ์หนัก) แต่ในแบบสอบถามที่รวบรวมฉันไม่สามารถใช้พวกเขาและต้องเขียนไวยากรณ์แบบสอบถามปกติอีกครั้ง ตอนนี้ฉันกำลังทำแบบสอบถามย่อยเดียวกันใน 2 แห่งต้องจำไว้ว่าต้องอัปเดตทั้งสองอย่าง ฝันร้าย


4

ฉันคิดว่า # 1 ความเข้าใจผิดเกี่ยวกับ LINQ กับ SQL คือคุณยังต้องรู้จัก SQL เพื่อให้สามารถใช้งานได้อย่างมีประสิทธิภาพ

อีกสิ่งหนึ่งที่เข้าใจผิดเกี่ยวกับ Linq ถึง SQL คือคุณยังคงต้องลดความปลอดภัยของฐานข้อมูลของคุณลงจนถึงจุดที่ไร้สาระเพื่อให้มันทำงานได้

ประเด็นที่สามคือการใช้ Linq ถึง Sql พร้อมกับคลาสแบบไดนามิก (หมายถึงคำจำกัดความของคลาสนั้นถูกสร้างขึ้นที่รันไทม์) ทำให้มีการรวบรวมในเวลาอันรวดเร็ว ซึ่งสามารถฆ่าประสิทธิภาพได้อย่างแน่นอน


4
มันมีประโยชน์มากที่จะรู้ SQL อยู่แล้ว SQL บางตัวที่ปล่อยออกมาโดย Linq ไปยัง SQL (และ ORM อื่น ๆ ) สามารถพิรุธอย่างจริงจังและการรู้ SQL ช่วยวินิจฉัยปัญหาดังกล่าว นอกจากนี้ Linq ไปยัง SQL สามารถใช้ประโยชน์จากขั้นตอนการจัดเก็บ
Robert Harvey


2

ดังที่กล่าวมาการโหลดแบบขี้เกียจและการดำเนินการที่เลื่อนออกไป

วิธี LINQ กับวัตถุและ LINQ กับ XML (IEnumerable) แตกต่างจาก LINQ ไปยัง SQL (IQueryable)

วิธีสร้าง Data Access Layer, Business Layer และ Presentation Layer ด้วย LINQ ในทุกชั้น .... และเป็นตัวอย่างที่ดี


สองคนแรกที่ฉันทำได้ ฉันไม่ต้องการที่จะลองทำที่สามยังอยู่ใน "นี้เป็นวิธีที่เหมาะสมที่จะทำมัน" ความรู้สึก ...
จอนสกีต

+1 จนกระทั่งคุณชี้ให้เห็นฉันไม่ได้ตระหนักว่า LINQ-to-Objects และ LINQ-to-XML นั้นมี IEnumerable ซึ่งต่างจาก LINQ-to-SQL ที่เป็น IQueryable แต่ก็สมเหตุสมผลแล้ว ขอบคุณ!
Pretzel

2

อย่างที่คนส่วนใหญ่พูดว่าฉันคิดว่าส่วนที่เข้าใจผิดมากที่สุดคือสมมติว่า LINQ เป็นเพียงการแทนที่ T-SQL ผู้จัดการของฉันที่คิดว่าตัวเองเป็นกูรู TSQL จะไม่ให้พวกเราใช้ LINQ ในโครงการของเราและแม้แต่เกลียด MS ในการปล่อยเรื่องนี้ !!!


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.