Khía cạnh khó hiểu hay khó hiểu nhất của LINQ là gì? [đóng cửa]


282

Bối cảnh: Trong tháng tới, tôi sẽ có ba bài nói về hoặc ít nhất là bao gồm LINQtrong bối cảnh C#. Tôi muốn biết những chủ đề nào đáng để chú ý một cách hợp lý, dựa trên những gì mọi người có thể cảm thấy khó hiểu hoặc những gì họ có thể có ấn tượng sai lầm. Tôi sẽ không nói cụ thể về LINQđến SQLhoặc khung Entity trừ khi được ví dụ về cách truy vấn có thể được thực hiện từ xa sử dụng cây biểu thức (và thường IQueryable).

Vì vậy, những gì bạn đã tìm thấy khó khăn về LINQ? Bạn đã thấy gì về sự hiểu lầm? Ví dụ có thể là bất kỳ điều nào sau đây, nhưng xin đừng giới hạn bản thân!

  • Cách C#trình biên dịch xử lý các biểu thức truy vấn
  • Biểu thức Lambda
  • Cây biểu hiện
  • Phương pháp mở rộng
  • Các loại ẩn danh
  • IQueryable
  • Trì hoãn so với thực hiện ngay lập tức
  • Truyền phát so với thực thi được đệm (ví dụ OrderBy bị hoãn nhưng được đệm)
  • Hoàn toàn gõ các biến cục bộ
  • Đọc chữ ký chung phức tạp (ví dụ Enumerable.Join )

3
Tôi rất muốn biết khi nào bạn sẽ thực hiện những cuộc nói chuyện này, và nếu có cách nào để xem chúng trực tuyến
Mark Heath

2
Buổi nói chuyện đầu tiên: Copenhagen, ngày 30 tháng 10. Hy vọng điều này sẽ được ghi âm. (Cả ngày!) Cuộc nói chuyện thứ hai: London, ngày 19 tháng 11 vào buổi tối, Nhóm người dùng London .NET, có lẽ trên Push LINQ. Buổi nói chuyện thứ ba: Đọc, ngày 22 tháng 11, Ngày nhà phát triển nhà phát triển, triển khai LINQ cho các đối tượng trong 60 phút.
Jon Skeet

1
Downvoters: vui lòng thêm một bình luận giải thích.
Jon Skeet

2
@Jon, Xin lỗi, nhưng tôi cần phải đóng cái này.
Tim Post

3
@Tim: Đủ công bằng - dù sao nó cũng không nhận được câu trả lời nào nữa. Cá nhân tôi nghĩ rằng nó đã kết thúc được xây dựng, quan tâm bạn - Tôi chắc chắn tìm thấy nó hữu ích để xem những gì mọi người tìm thấy khó khăn. Tôi có lẽ đã không hỏi nó bây giờ mặc dù ...
Jon Skeet

Câu trả lời:


271

Thi hành chậm trễ


12
Righto - đây rõ ràng là yêu thích của độc giả, đó là điều quan trọng nhất cho câu hỏi này. Tôi cũng sẽ thêm "đệm so với phát trực tuyến" vào hỗn hợp, vì điều đó có liên quan chặt chẽ - và thường không được thảo luận chi tiết như tôi muốn thấy trong sách.
Jon Skeet

10
Có thật không? Tôi có bản chất lười biếng đã chỉ ra cho tôi rất nhiều lần khi học Linq, nó không bao giờ là vấn đề đối với tôi.
Adam Lassek

26
Đồng ý với ALassek. Tài liệu MSDN nêu rõ bản chất đánh giá lười biếng của LINQ. Có lẽ vấn đề thực sự là bản chất lập trình lười biếng của các nhà phát triển ... =)
Seiti

4
... đặc biệt là khi bạn nhận ra rằng nó áp dụng cho LINQ cho các đối tượng chứ không chỉ SQL LINQ 2 - khi bạn thấy 10 lệnh gọi phương thức web để lấy danh sách các mục khi bạn đã liệt kê qua danh sách các mục đó và bạn nghĩ rằng danh sách đã được đánh giá
Simon_Weaver

5
Biết được tuyên bố lợi nhuận là gì và cách thức hoạt động của nó là rất quan trọng để hiểu rõ về LINQ.
peSHIr

125

Bây giờ tôi biết khái niệm thực thi bị trì hoãn nên được đánh vào tôi, nhưng ví dụ này thực sự đã giúp tôi nắm bắt thực tế về nó:

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

Đoạn mã trên trả về như sau:

Before add:
Bob
Alice
Trent

After add:
Bob
Alice
Trent
Mallory

2
blog.msdn.com/b/charlie/archive 2007/12/09 / W <- Tôi nghĩ rằng đây là blog tốt nhất để giải thích nó theo ý kiến ​​của tôi. (từ năm 2007 đến nay, không thể tin rằng nó đã tồn tại từ lâu)
Phill

104

Rằng có nhiều hơn là chỉ LINQđể SQLvà các tính năng có nhiều hơn chỉ là một SQLphân tích cú pháp nhúng bằng ngôn ngữ.


6
Tôi phát ốm vì mọi người nghĩ rằng: /
TraumaPony

40
Không phải ai cũng làm được! Tôi vẫn không biết LINQ to SQL là gì và tôi sử dụng LINQ mọi lúc.
Robert Rossney

2
Tôi cảm thấy rất khó chịu khi tôi cố gắng giải thích điều gì đó bằng LINQ và người khác chỉ nhìn tôi và nói "ohhh tôi không sử dụng LINQ cho bất cứ điều gì như vậy, chỉ có SQL" :(
Nathan W

13
Đồng ý, nhiều người dường như không hiểu rằng LINQ là một công cụ có mục đích chung.
Matthew Olenik

86

Ký hiệu O lớn . LINQ làm cho việc viết các thuật toán O (n ^ 4) cực kỳ dễ dàng mà không nhận ra nó, nếu bạn không biết bạn đang làm gì.


16
Làm thế nào về một ví dụ?
hughdbrown

4
Theo như một ví dụ, có lẽ anh ta có nghĩa là thực tế là rất dễ có mệnh đề Chọn chứa nhiều toán tử Sum () với mỗi toán tử gây ra một lần chuyển khác trên toàn bộ tập bản ghi.
Rob Packwood

1
Trong thực tế, nó thậm chí có thể đáng để xem qua ký hiệu O lớn là gì và tại sao nó quan trọng, cũng như một số ví dụ về các truy vấn kết quả không hiệu quả. Tôi nghĩ đó là những gì mà poster ban đầu gợi ý, nhưng tôi nghĩ dù sao tôi cũng đề cập đến nó. - EDIT: vừa nhận ra rằng bài đăng này đã 1,5 năm tuổi :-)
zcrar70

7
Đó sẽ không phải là O (n ^ x), đó sẽ là O (xn), chỉ là O (n).
Malfist

3
Cố gắng thực hiện phép nối mà không có toán tử nối sẽ dẫn đến O (n ^ x): từ i1 trong phạm vi1 từ i2 trong phạm vi 2 từ i3 trong phạm vi 3 từ i4 trong phạm vi 4 trong đó i1 == i2 && i3 == i4 chọn {i1 mới, i2, i3, i4}. Và tôi thực sự đã thấy điều này được viết trước đây. Nó hoạt động, nhưng rất chậm.
MarkPflug

55

Tôi nghĩ rằng thực tế là một Lambdabiểu thức có thể phân giải cho cả cây biểu thức và đại biểu ẩn danh, vì vậy bạn có thể chuyển cùng một lambdabiểu thức khai báo cho cả IEnumerable<T>phương thức IQueryable<T>mở rộng và phương thức mở rộng.


2
Đã đồng ý. Tôi là một người kỳ cựu và tôi chỉ nhận ra đúc ngầm này đang diễn ra như tôi bắt đầu viết QueryProvider của riêng tôi
TheSoftwareJedi

53

Đã cho tôi cách quá lâu để nhận ra rằng nhiều phương pháp khuyến nông LINQ như Single(), SingleOrDefault()vv có quá tải mà mất lambdas.

Bạn có thể làm :

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

và không cần phải nói điều này - điều mà một số hướng dẫn tồi đã khiến tôi có thói quen làm

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

+1, rất hay. Tôi sẽ ghi nhớ nó.
Pretzel

4
Tôi tiếp tục quên điều này là tốt. Điều đó cũng đúng Count(), trong số những người khác. Bạn có biết nếu có bất kỳ sự khác biệt về hiệu suất, ngoài phần thưởng rõ ràng về khả năng đọc mã?
Justin Morgan

1
Ở trường đại học, giảng viên của tôi muốn lấy điểm vì sử dụng những quá tải này !! Tôi đã chứng minh anh ta sai!
TDaver

12
Nghe có vẻ lạ nhưng tôi thích cú pháp thứ hai. Tôi thấy nó dễ đọc hơn.
Konamiman

40

Trong LINQ to SQL tôi liên tục thấy mọi người không hiểu DataContext, làm thế nào nó có thể được sử dụng và làm thế nào để sử dụng nó. Quá nhiều người không nhìn thấy DataContext cho mục đích của nó, một đối tượng Đơn vị công việc, không phải là một đối tượng liên tục.

Tôi đã thấy nhiều lần mọi người đang cố gắng đơn lẻ một DataContext / phiên nó / vv thay vì tạo thời gian mới cho mỗi hoạt động.

Và sau đó, việc xử lý DataContext trước khi IQueryable được đánh giá nhưng đó là một điều khó hiểu với những người không hiểu IQueryable hơn DataContext.

Khái niệm khác mà tôi thấy rất nhiều nhầm lẫn với là Cú pháp Cú pháp vs Cú pháp Biểu thức. Tôi sẽ sử dụng cái nào là dễ nhất vào thời điểm đó, thường gắn bó với Expression Syntax. Nhiều người vẫn không nhận ra rằng cuối cùng họ sẽ tạo ra cùng một thứ, Truy vấn được biên dịch thành Biểu thức.


2
Cảnh báo: Đơn vị công việc có thể là một chương trình nhỏ với bối cảnh dữ liệu dưới dạng đơn.
liệu

15
Bạn không nên sử dụng DataContext trong một singleton, nó không an toàn cho chuỗi.
Aaron Powell

3
@Slace, không phải tất cả các chương trình đều là đa luồng, vì vậy, có thể có DataContext dưới dạng đơn lẻ trong rất nhiều phần mềm "máy tính để bàn"
Ian Ringrose

2
Tôi đã bị cắn bởi điều này (sử dụng DataContext như một singleton) khi tôi thực hiện dự án LINQ to SQL đầu tiên của mình. Tôi không nghĩ rằng các tài liệu và sách làm cho điều này đủ rõ ràng. Trên thực tế, tôi nghĩ rằng tên có thể được cải thiện, nhưng tôi không biết làm thế nào.
Roger Lipscombe

1
Tôi đã đọc các tác phẩm nghệ thuật của ScottGu trên Linq nhiều lần để khiến điều này dồn nén trong đầu tôi.
Evan Plaice

34

Tôi nghĩ phần bị hiểu lầm của LINQ là nó là một phần mở rộng ngôn ngữ , không phải là phần mở rộng hoặc xây dựng cơ sở dữ liệu.

LINQquá nhiều chi tiết hơn LINQ to SQL.

Bây giờ hầu hết chúng ta đã sử dụng LINQtrên các bộ sưu tập, chúng tôi sẽ KHÔNG BAO GIỜ quay trở lại!

LINQ là tính năng quan trọng nhất đối với .NET kể từ Generics trong 2.0 và Các loại ẩn danh trong 3.0.

Và bây giờ chúng ta có Lambda, tôi không thể chờ lập trình song song!


Tôi thậm chí còn gọi nó là quan trọng hơn các loại ẩn danh, và thậm chí có thể nhiều hơn cả thuốc generic.
Justin Morgan

26

Tôi chắc chắn sẽ biết nếu tôi cần biết cây biểu hiện là gì và tại sao.


6
Tôi nghĩ rằng đáng để biết cây biểu hiện là gì và tại sao chúng tồn tại, nhưng không phải là chi tiết về cách tự xây dựng chúng. (Chúng là một nỗi đau khi xây dựng bằng tay, nhưng trình biên dịch sẽ làm rất tốt khi chuyển đổi biểu thức lambda.)
Jon Skeet

3
Trên thực tế, tôi đã suy nghĩ về việc thực hiện một vài mục blog trên cây biểu thức (vì tôi "lấy" chúng). Tôi thấy cây biểu hiện thao túng rất hữu ích ...
Marc Gravell

Tuy nhiên, tôi không nghĩ rằng chúng hữu ích cho (các) cuộc nói chuyện của Jon ;-p
Marc Gravell

3
Tôi chỉ lo lắng rằng các cây biểu hiện sẽ giống như tuyên bố lợi suất: thứ gì đó hóa ra có giá trị vô cùng mặc dù lúc đầu tôi không hiểu nó dùng để làm gì.
Robert Rossney

1
Marc Gravell Tôi rất thích đọc các mục blog của bạn về chủ đề này. Nhìn về phía trước
Alexandre Brisebois

20

Tôi khá mới với LINQ. Đây là những điều tôi đã vấp ngã trong nỗ lực đầu tiên của tôi

  • Kết hợp nhiều truy vấn thành một
  • Gỡ lỗi hiệu quả các truy vấn LINQ trong Visual Studio.

21
Gỡ lỗi LINQ là một chủ đề của chính nó, và là một chủ đề quan trọng. Tôi nghĩ điểm yếu lớn nhất của LINQ là nó cho phép bạn viết các khối logic phức tạp tùy ý mà bạn không thể bước qua.
Robert Rossney

3
đây có thể là một nơi tốt để sử dụng pad LINQ
Maslow

2
Đồng ý chân thành; đó là lý do tại sao tôi đã viết Bí mật LINQ được tiết lộ: Xâu chuỗi và gỡ lỗi , vừa được xuất bản trên Simple-Talk.com, mà bạn có thể tìm thấy sự trợ giúp.
Michael Sorens

Có, LinqPad là một công cụ phụ tuyệt vời để phát triển các truy vấn LINQ của bạn. Đặc biệt là khi bắt đầu và bạn chưa quen với các quy ước / mẫu.
Trâu

20

Một cái gì đó mà ban đầu tôi không nhận ra là cú pháp LINQ không yêu cầu IEnumerable<T>hoặc IQueryable<T>không hoạt động, LINQ chỉ là về khớp mẫu.

văn bản thay thế http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png

Đây là câu trả lời (không, tôi đã không viết blog đó, Bart De Smet đã làm và anh ấy là một trong những blogger giỏi nhất trên LINQ tôi đã tìm thấy).


1
Bạn cũng có thể thấy bài đăng trên blog này rất thú vị: msmvps.com/bloss/jon_skeet/archive/2008/02/29/ Kẻ
Jon Skeet

Bài đăng tuyệt vời Jon (Tôi đăng ký vào blog của bạn, chỉ gần đây thôi).
Aaron Powell

19

Tôi vẫn gặp sự cố với lệnh "let" (mà tôi chưa bao giờ tìm thấy cách sử dụng) và SelectMany (mà tôi đã sử dụng, nhưng tôi không chắc là mình đã làm đúng)


2
Bất cứ khi nào bạn muốn giới thiệu một biến bạn sẽ sử dụng câu lệnh let. Hãy nghĩ về một vòng lặp truyền thống nơi bạn đang giới thiệu các biến trong đó và đặt tên cho mỗi biến để giúp dễ đọc mã. Đôi khi cũng tốt khi bạn có một câu lệnh let đánh giá kết quả hàm, sau đó bạn có thể chọn và đặt hàng mà không phải đánh giá kết quả hai lần.
Rob Packwood

'Let' cho phép bạn thực hiện các loại hỗn hợp. Đồ tiện dụng.
Phill

19

Hiểu khi sự trừu tượng giữa các nhà cung cấp Linq bị rò rỉ. Một số thứ hoạt động trên các đối tượng nhưng không phải SQL (ví dụ: .TakeWhile). Một số phương thức có thể được dịch sang SQL (ToUpper) trong khi các phương thức khác không thể. Một số kỹ thuật hiệu quả hơn trong các đối tượng trong đó các kỹ thuật khác hiệu quả hơn trong SQL (các phương thức nối khác nhau).


1
Đây là một điểm rất tốt. Điều đó không giúp ích gì cho việc Intellisense sẽ cho bạn thấy TẤT CẢ chúng và nó thường sẽ được biên dịch. Sau đó, bạn nổ tung trong thời gian chạy. Tôi hy vọng VS 2010 thực hiện công việc tốt hơn trong việc hiển thị các phương thức mở rộng có liên quan.
Jason Short

12

Đôi điều.

  1. Mọi người nghĩ về Linq như Linq thành SQL.
  2. Một số người nghĩ rằng họ có thể bắt đầu thay thế tất cả các foreach / logic bằng các truy vấn Linq mà không xem xét hàm ý hiệu suất này.

11

OK, do nhu cầu, tôi đã viết lên một số nội dung Biểu hiện. Tôi không hài lòng 100% với cách blogger và LiveWriter đã âm mưu định dạng nó, nhưng bây giờ nó sẽ làm ...

Dù sao, ở đây đi ... Tôi thích bất kỳ thông tin phản hồi, đặc biệt là nếu có những khu vực mà mọi người muốn biết thêm thông tin.

Nó đây , thích hay ghét nó ...


10

Một số thông báo lỗi, đặc biệt là từ LINQ đến SQL có thể khá khó hiểu. cười toe toét

Tôi đã bị cắn bởi vụ hành quyết bị trì hoãn một vài lần như mọi người khác. Tôi nghĩ điều khó hiểu nhất đối với tôi là Nhà cung cấp truy vấn SQL Server và những gì bạn có thể và không thể làm với nó.

Tôi vẫn còn ngạc nhiên bởi thực tế là bạn không thể thực hiện Tổng () trên cột thập phân / tiền đôi khi trống. Sử dụng Default IfEmpty () sẽ không hoạt động. :


1
Sẽ dễ dàng để dễ dàng tát một vị trí trên truy vấn đó để thực hiện công việc tổng hợp
Esben Skov Pedersen

9

Tôi nghĩ rằng một điều tuyệt vời để bao quát trong LINQ là làm thế nào bạn có thể gặp rắc rối về hiệu suất. Ví dụ, sử dụng số đếm của LINQ làm điều kiện vòng lặp thực sự, thực sự không thông minh.


7

Rằng IQueryable chấp nhận cả hai Expression<Func<T1, T2, T3, ...>>Func<T1, T2, T3, ...>, mà không đưa ra gợi ý về sự suy giảm hiệu năng trong trường hợp thứ hai.

Đây là ví dụ mã, điều đó thể hiện điều tôi muốn nói:

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

Bạn có thể giải thích? Tôi không theo dõi ...
Pretzel

@Pretzel Tôi đã thêm ví dụ mã, điều đó chứng minh vấn đề của tôi.
Valera Kolupaev

Cảm ơn ví dụ mã! Rất hữu ích.
Trâu

6

Tôi không biết nếu nó đủ điều kiện là hiểu lầm - nhưng đối với tôi, đơn giản là không biết.

Tôi rất vui khi tìm hiểu về DataLoadOptions và cách tôi có thể kiểm soát bảng nào được tham gia khi tôi thực hiện một truy vấn cụ thể.

Xem ở đây để biết thêm: MSDN: DataLoadOptions


6

Tôi muốn nói khía cạnh bị hiểu sai nhất (hoặc không nên hiểu?) Của LINQ là các nhà cung cấp LINQ tùy chỉnhIQueryable .

Tôi đã sử dụng LINQ được một thời gian và hoàn toàn thoải mái trong thế giới IEnumerable và có thể giải quyết hầu hết các vấn đề với LINQ.

Nhưng khi tôi bắt đầu xem và đọc về IQueryable, và Expressions và các nhà cung cấp linq tùy chỉnh, nó khiến đầu óc tôi quay cuồng. Hãy xem cách LINQ to SQL hoạt động nếu bạn muốn xem một số logic khá phức tạp.

Tôi mong được hiểu khía cạnh đó của LINQ ...


6

Như hầu hết mọi người đã nói, tôi nghĩ phần bị hiểu lầm nhất là giả định LINQ chỉ là sự thay thế cho T-SQL. Người quản lý của tôi, người tự coi mình là một chuyên gia TSQL sẽ không cho phép chúng tôi sử dụng LINQ trong dự án của mình và thậm chí ghét MS vì đã phát hành một thứ như vậy !!!


Quá nhiều người sử dụng nó để thay thế cho TSQL. Hầu hết trong số họ chưa bao giờ nghe nói về một kế hoạch thực hiện.
erikkallen

+1 vì tôi đồng ý với người quản lý của bạn, ít nhất là trong chừng mực cho phép LINQ thành SQL trong bất kỳ dự án nào. LINQ to Object là một vấn đề hoàn toàn khác.
NotMe

5

Var thể hiện điều gì khi một truy vấn được thực thi?

Được nó iQueryable, iSingleResult, iMultipleResult, hoặc dùng nó thay đổi dựa trên việc thực hiện. Có một số suy đoán về việc sử dụng (có vẻ là) gõ động so với gõ tĩnh tiêu chuẩn trong C #.


AFAIK var luôn là lớp cụ thể được đề cập (ngay cả khi đó là loại ẩn danh) vì vậy nó không bao giờ là IQueryable, ISingleResult hoặc bất cứ điều gì bắt đầu bằng 'I' (các lớp cụ thể bắt đầu bằng 'Tôi' không cần phải áp dụng).
Motti

5

Làm thế nào dễ dàng để lồng một vòng lặp là điều tôi không nghĩ mọi người đều hiểu.

Ví dụ:

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

+1, whoa. Điều đó khá mạnh mẽ.
Pretzel

4

group by vẫn làm đầu óc tôi quay cuồng.

Bất kỳ sự nhầm lẫn nào về việc thực thi bị trì hoãn sẽ có thể được giải quyết bằng cách chuyển qua một số mã dựa trên LINQ đơn giản và chơi xung quanh trong cửa sổ xem.


1
Tôi đã thấy rằng việc triển khai khá nhiều LINQ cho các đối tượng để giải trí thực sự có ích :) Nhưng vâng, nó hơi khó hiểu - chắc chắn nếu tôi không thực hiện bất kỳ LINQ nào trong một thời gian tôi phải quay lại chữ ký. Tương tự như vậy "tham gia" vs "tham gia" thường khiến tôi ...
Jon Skeet

4

Truy vấn tổng hợp

Thực tế là bạn không thể xâu chuỗi IQueryablevì chúng là các cuộc gọi phương thức (trong khi vẫn không có gì khác ngoài SQL có thể dịch được!) Và gần như không thể làm việc xung quanh nó đang gây chú ý và tạo ra một sự vi phạm lớn về DRY. Tôi cần tài IQueryablekhoản quảng cáo mà tôi không có các truy vấn đã biên dịch (tôi chỉ có các truy vấn được biên dịch cho các kịch bản nặng), nhưng trong các truy vấn đã biên dịch, tôi không thể sử dụng chúng và thay vào đó cần phải viết lại cú pháp truy vấn thông thường. Bây giờ tôi đang thực hiện các truy vấn con giống nhau ở 2 nơi, cần nhớ cập nhật cả hai nếu có gì đó thay đổi, v.v. Một cơn ác mộng.


4

Tôi nghĩ quan niệm sai lầm số 1 về LINQ to SQL là bạn VẪN PHẢI BIẾT SQL để sử dụng hiệu quả nó.

Một điều sai lầm khác về Linq đối với Sql là bạn vẫn phải hạ thấp bảo mật cơ sở dữ liệu của mình đến mức vô lý để làm cho nó hoạt động.

Điểm thứ ba là việc sử dụng Linq cho Sql cùng với các lớp Động (có nghĩa là định nghĩa lớp được tạo trong thời gian chạy) gây ra một số lượng rất lớn việc biên dịch đúng lúc. Mà hoàn toàn có thể giết chết hiệu suất.


4
Tuy nhiên, rất có lợi khi đã biết SQL. Một số SQL được Linq phát ra từ SQL (và các ORM khác) có thể hết sức đáng ngờ và việc biết SQL giúp chẩn đoán các vấn đề như vậy. Ngoài ra, Linq to SQL có thể sử dụng các thủ tục được lưu trữ.
Robert Harvey


2

Như đã đề cập, lười tải và thực thi hoãn lại

LINQ to Object và LINQ to XML (IEnumerable) khác nhau như thế nào từ LINQ đến SQL (IQueryable)

CÁCH xây dựng Lớp truy cập dữ liệu, Lớp nghiệp vụ và Lớp trình bày với LINQ trong tất cả các lớp .... và một ví dụ điển hình.


Hai cái đầu tiên tôi có thể làm. Tôi sẽ không muốn thử làm thứ ba được nêu ra trong một "này là đúng cách để làm điều đó" cảm giác ...
Jon Skeet

+1, cho đến khi bạn chỉ ra điều đó, tôi đã nhận ra rằng LINQ-to-Object và LINQ-to-XML là IEnumerable trái ngược với LINQ-to-SQL như IQueryable, nhưng nó có ý nghĩa. Cảm ơn!
Pretzel

2

Như hầu hết mọi người đã nói, tôi nghĩ phần bị hiểu lầm nhất là giả định LINQ chỉ là sự thay thế cho T-SQL. Người quản lý của tôi, người tự coi mình là một chuyên gia TSQL sẽ không cho phép chúng tôi sử dụng LINQ trong dự án của mình và thậm chí ghét MS vì đã phát hành một thứ như vậy !!!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.