2010-03-19 60 views
5

Tôi vừa xem Linq với ASP.Net. Nó thực sự rất gọn gàng. Tôi chỉ tự hỏi - làm thế nào để tất cả các lớp học được dân cư? Tôi có nghĩa là trong ASP.Net, giả sử bạn có một tập tin LINQ gọi là Catalog, và sau đó bạn sử dụng một vòng lặp For để lặp qua Catalogue.Products và in từng tên sản phẩm. Các chi tiết được lưu trữ như thế nào? Liệu nó có đi qua bảng Sản phẩm khi tải trang và tạo một phiên bản khác của lớp Sản phẩm cho mỗi hàng, sao chép hiệu quả toàn bộ một bảng vào một mảng của lớp Sản phẩm? Nếu có, tôi nghĩ rằng tôi đã tạo ra một hệ thống rất giống như thế này, theo nghĩa là có một mô-đun SiteContent với một thể hiện của mỗi lớp Manager - ví dụ như UserManager, ProductManager, SettingManager và giống nhau. UserManager chứa một thể hiện của lớp User cho mỗi hàng trong bảng Users. Chúng cũng chứa các phương thức như Create, Update và Remove. Những người quản lý này và "Mục" của họ được tạo trên mỗi lần tải trang. Điều này chỉ làm cho nó tốt đẹp và dễ dàng để truy cập người dùng, sản phẩm, cài đặt vv trong mỗi trang như xa như tôi, các nhà phát triển, có liên quan. Bất kỳ trang tiếp theo nào tôi cần tạo, tôi chỉ cần tham khảo SiteContent.UserManager để truy cập danh sách người dùng, thay vì thực hiện truy vấn từ bên trong trang đó (tức là phương pháp này tách truy cập dữ liệu khỏi hoạt động của trang, trong cùng một cách như sử dụng mã phía sau tách ra các hoạt động của trang từ cách trang được đặt ra).LINQ - nó hoạt động như thế nào?

Tuy nhiên, vấn đề là kỹ thuật này có vẻ khá chậm. Tôi có nghĩa là nó có hiệu quả tạo ra một cơ sở dữ liệu trên mỗi tải trang, lấy dữ liệu từ cơ sở dữ liệu khác. Tôi đã thực hiện các biện pháp như ngăn chặn, ví dụ, ProductManager được tạo ra nếu nó không được tham chiếu trên tải trang. Do đó nó không tải dữ liệu vào bộ nhớ khi nó không cần thiết.

Câu hỏi của tôi về cơ bản là cho dù kỹ thuật của tôi làm điều chính xác giống như LINQ, theo nghĩa sao chép dữ liệu từ các bảng vào thuộc tính của lớp ..

Cảm ơn trước cho bất kỳ lời khuyên hoặc câu trả lời về vấn đề này.

Kính trọng,

Richard Clarke

+2

LINQ không giống với LINQ-to-SQL. – SLaks

+0

Xin chào tất cả, Cảm ơn tất cả các câu trả lời. Hầu hết trong số họ chứa thông tin hữu ích, công cụ (chẳng hạn như LinqPad) hoặc sách (chẳng hạn như Linq in Action) - Tôi chắc chắn sẽ xem xét thêm những thông tin này. Như tôi đã nói trong bình luận của tôi về Aaronaughts trả lời, tôi có thể không có thời gian để thực hiện Linq trong dự án của tôi, nhưng tôi chắc chắn sẽ làm rất nhiều nghiên cứu về nó cho luận án của tôi. Nếu bất kỳ ai có thêm nhận xét để thêm - chẳng hạn như các sách hoặc trang web khác mà tôi có thể quan tâm, họ đã có trải nghiệm tốt, thì hãy nói như vậy - tôi cũng chắc chắn sẽ xem xét chúng. Cảm ơn một lần nữa. Trân trọng, Richard – ClarkeyBoy

Trả lời

9

LINQ to SQL không duy trì bản sao của tất cả dữ liệu trong cơ sở dữ liệu. Phải mất các biểu thức bạn nạp nó thông qua các giao diện IQueryable, đọc các cây biểu thức và chuyển đổi chúng thành các câu lệnh SQL thực tế sử dụng WHERE và các cấu trúc SQL khác.

Nói cách khác, khi bạn viết này:

var product = context.Products.Where(p => p.ID == 50).SingleOrDefault(); 

Nó thực thi này đối với cơ sở dữ liệu:

SELECT ID, Name, Foo, Bar, Baz, Blah, ... 
FROM Products 
WHERE ProductID = 50 

không chỉ cần làm một SELECT * FROM Products và sau đó tìm kiếm các sản phẩm cụ thể từ bên trong kết quả.

Ứng dụng của bạn sẽ chậm thực sự nếu bạn cố gắng "tải xuống" toàn bộ cơ sở dữ liệu trên mỗi lần tải trang. Đó chắc chắn không phải là những gì LINQ to SQL, LINQ to Entities, hoặc bất kỳ khung công tác ORM nào khác.

+1

+1 lời giải thích thú vị! –

+0

Chỉ cần thêm: và đó là công nghệ mà tôi đã sử dụng gần 20 năm trước. 10 năm trước về C#. Không có gì mới, rất nhiều tài liệu xung quanh về nó. – TomTom

+0

Cảm ơn bạn đã trả lời. Tôi nghĩ rằng câu trả lời này có thể giải thích cho tôi theo cách mà tôi có thể dễ dàng hiểu được (không nói rằng tôi không thể hiểu được các câu trả lời khác ..). Tôi chỉ nhúng vào Linq một chút, vì toàn bộ dự án của tôi (và luận án) là do trong chưa đầy 2 tháng, và tôi chưa thực hiện nhiều luận án: (Đây là điều tôi có thể dễ dàng nhận xét về điều gì đó mà tôi đã thay đổi) nếu tôi có thời gian để Nhờ tất cả cho câu trả lời -..?. nhiều đánh giá cao Kính trọng, Richard – ClarkeyBoy

0

Trong LINQ, Bạn tạo một bối cảnh dữ liệu trong đó quản lý những thay đổi dữ liệu giữa các cơ sở dữ liệu và mô hình đối tượng.

Có các công cụ tức là nhà thiết kế hoặc sqlmetal cho phép bạn tạo ánh xạ giữa các trường bảng cơ sở dữ liệu và mô hình đối tượng.

Trong trường hợp của một người mẫu bị ngắt kết nối như asp.net bạn có thể dùng đính kèm phương pháp để duy trì cập nhật lĩnh vực, vv

Tôi hiện đang đọc một cuốn sách thực sự tốt trên LINQ gọi LINQ trong hành động, cung cấp một tốt giới thiệu về Linq. Theo như so sánh mô hình của bạn với những gì Linq làm, bạn có thể muốn đọc một chút, vì Linq thực hiện khá nhiều quản lý giữa việc quản lý các đối tượng ở cấp mã và dịch mã này sang lớp dữ liệu.

Với LINQ to SQL có một lớp biểu thức chuyển đổi mã đối tượng thành sql bằng cách sử dụng nhà cung cấp dữ liệu khá mạnh.

Linq hiển thị lớp biểu thức này cho bạn bằng cách sử dụng cái gì đó gọi là Cây biểu thức. Sau đó, bạn có thể sửa đổi các nút này trong cây biểu thức để sửa đổi mã mà sau đó được tạo ra ở lớp dữ liệu.

1

Bạn sẽ cần phải dành một chút thời gian làm quen với cú pháp LINQ và hiểu cách chỉ trích xuất dữ liệu bạn cần. Tôi khuyên bạn nên tải xuống LINQPad ...ví dụ chi tiết và cung cấp cho bạn một sandbox đẹp để chơi và làm cho đôi chân của bạn ướt. Sẽ có thời gian để tham gia nhiều hơn khi bạn có được những điều căn bản ...

+0

+1 cho liên kết tới LinqPad ... trông giống như một công cụ tốt. –

0

Nhà cung cấp LINQ to SQL kết hợp với trình biên dịch C#, giao diện IQueryable hoạt động hơi khác một chút khi biên dịch trái với tiêu chuẩn trong bộ nhớ (IEnumerable). Cây biểu hiện được xây dựng, this pos t là rất hữu ích trong sự hiểu biết về những gì đang xảy ra bên dưới vỏ. Nhà cung cấp LINQ to SQL chấp nhận Biểu thức, không chấp nhận Func và các hành động. Xem bài đăng để biết chi tiết.

+0

Thông đồng Không, trừ khi bạn bao gồm tất cả các net biên soạn ngôn ngữ và cũng mỗi nhà cung cấp LINQ (như LinqToEntities) Sau đó, –

+0

Không nhận ra đây là một diễn đàn về ngữ nghĩa – kd7

2

LINQ to SQL chắc chắn không "tạo cơ sở dữ liệu trên mọi tải trang" ..... bạn cần thu hút đầu của bạn xung quanh cách hoạt động của LINQ-SQL và nó hoạt động như thế nào.

Đề xuất của tôi: hãy xem multi-part series of blog post bởi "The Gu" - Scott Guthrie - và hấp thụ tất cả những perls của trí tuệ trong những bài đăng đó.

Rất nhiều phép thuật được ẩn đằng sau nhà thiết kế trực quan, về cơ bản tạo ra "ảnh chụp nhanh" của cấu trúc bảng - nhưng chỉ có cấu trúc! Và nó biết cách chuyển đổi các truy vấn "gimme những bản ghi" của bạn thành các truy vấn T-SQL thẳng dựa vào phần cuối của SQL Server. Và nó chuyển đổi các bit và các mảnh quan hệ thành các đối tượng .NET đẹp mắt.

Công nghệ tiên tiến hoàn toàn gần như không thể phân biệt được với phép thuật - nhưng LINQ và LINQ-to-SQL thực sự không phải là ma thuật đen - chỉ là những đoạn mã rất thông minh của một số người sáng!

+0

Pop mở 'ObjectReaderCompiler' trong Reflector và thử nói với tôi rằng tất cả các cuộc gọi' Emit' đó là bất cứ điều gì ngoài ma thuật đen.;) – Aaronaught

+0

@ Aaronaught: ok, * nhất * LINQ và LINQ-to-SQL thực sự không có ma thuật đen - một số phần có thể là :-) –

0

LINQ to SQL giống như nhiều giải pháp Object Relationship Mapping và tạo các đối tượng và bộ sưu tập trừu tượng hóa các bảng thành các thực thể hướng đối tượng. Cách tiếp cận của bạn để tạo các lớp người quản lý cho các thực thể khác nhau là một chút bị thổi phồng và sẽ trở nên khó sử dụng một cách dễ dàng. Bạn có thể muốn xem xét sử dụng Pattern Repository và Domain Driven Design có nghĩa là bạn sẽ nhóm các thực thể lại với nhau thành một vài lớp cấp cao.

2

Magic ;-)

Không, nhưng nó khá là huyền diệu. LINQ hoạt động như thế nào là khá phức tạp, nhưng tôi thấy rằng tôi hầu như luôn nhận được hiệu suất tốt hơn hoặc bằng nhau với LINQ và mã là luôn luôn sạch hơn.

Nếu bạn muốn chơi với LINQ, hãy tải xuống LINQPad và xem qua các mẫu. Sau đó mua cuốn sách của Joe Albahari (của tác giả), C# 4.0 Trong một Nutshell cho tất cả các chi tiết đẫm máu!

+0

+1: cho LinqPad! –

0

Linq là tập hợp các monads. Cách hoạt động của monads được mô tả theo lý thuyết danh mục. Vì vậy, nếu bạn thực sự, thực sự muốn biết, hãy tìm kiếm các monads.

Các vấn đề liên quan