Đào Hải Nam

Hỏi đáp LINQ

Posted in Microsoft .NET by namdh on 08/12/2008

1. LINQ là gì ?

LINQ là một tập hợp các thành phần mở rộng cho phép viết các câu truy vấn dữ liệu ngay trong một ngôn ngữ lập trình, như C# hoặc VB.NET.

LINQ là từ viết tắt của “Language-Integrated Query”

2. Tôi cần có gì để lập trình LINQ ?

LINQ có từ bản .NET 3.5, vậy nên tối thiểu chương trình của bạn phải chạy trên nền tảng này.

Visual Studio 2008, hoặc các phiên bản Express của nó là các bộ công cụ phát triển tiêu biểu cho ứng dụng dùng LINQ.

Tải về Visual Studio 2008 tại đây.

Tải về Visual Studio Express tại đây.

3. LINQ và ADO.NET khác nhau chỗ nào ?

Nôm na, LINQ là tập mở rộng cho phép viết các câu truy vấn ngay trong các ngôn ngữ lập trình. Nó cho phép bạn làm việc với các kiểu tập hợp dữ liệu, như XML, collection, array,… và cả CSDL.

ADO.NET là công nghệ cho phép các ứng dụng có thể kết nối và làm việc với các loại CSDL khác nhau (truy vấn, cập nhật, thêm, xóa, gọi thủ tục…).

Bản thân LINQ không phải là một công nghệ được tạo ra để thay thế ADO.NET, bạn có thể làm việc với LINQ mà không dính gì đến CSDL. Tuy nhiên, LINQ to SQL, là một phần mở rộng của LINQ, cho phép bạn có thể làm việc được với CSDL SQL Server, trong trường hợp này thì khi viết bạn có thể bỏ qua các câu lệnh ADO.NET mà chỉ quan tâm tới cú pháp mà LINQ cung cấp.

Nhớ rằng dù bạn không hề dùng đến ADO.NET khi viết chương trình sử dụng LINQ to SQL, nhưng đằng sau nó, ADO.NET vẫn được dùng để thực hiện kết nối, gửi các câu lệnh, các lời gọi thủ tục…

4. LINQ có hỗ trợ Unicode không ?

Có, LINQ là một thành phần của .NET, và như vậy, LINQ hỗ trợ Unicode một cách hoàn toàn tự nhiên, bạn có thể làm các thao tác chèn, sửa dữ liệu với tiếng Việt mà không cần cấu hình thêm. Tất nhiên, khi thiết kế CSDL, bạn vẫn phải chọn kiểu dữ liệu (NVARCHAR) và collation phù hợp để LINQ có thể làm việc một cách đúng đắn.

5. Tôi không thể tìm thấy một số phương thức (Add, RemoveAll…) như các ví dụ trong loạt bài “LINQ to SQL”

Kể từ bản RTM, các phương thức dùng cho thêm và xóa entity đã được đổi tên, cụ thể như sau:

  • Add đổi thành InsertOnSubmit
  • AddAll đổi thành InsertAllOnSubmit
  • Remove đổi thành DeleteOnSubmit
  • RemoveAll đổi thành DeleteAllOnSubmit

(đang cập nhật tiếp, nếu có thắc mắc, xin hãy để lại comment, những comment không liên quan sẽ bị xóa)

Tagged with:

41 phản hồi

Subscribe to comments with RSS.

  1. duckman said, on 13/01/2009 at 17:04

    xin cho e hỏi, có cách nào truyền TEntity như 1 parameter vào hàm ko?

  2. namdh said, on 13/01/2009 at 17:13

    TEntity thực chất cũng là các lớp bình thường nên em vẫn có thể dùng nó như dùng các loại biến khác.

  3. duckman said, on 14/01/2009 at 09:00

    vâng, đầu tiên cho e xin cám ơn a Nam đã trả lời rất sớm thắc mắc của e. A có thể cho e 1 ví dụ về cách định nghĩa và gọi hàm có chứa TEntity ko?Vì thú thật kiến trúc Lambda Expression e chưa hiểu gì lắm.

  4. namdh said, on 14/01/2009 at 10:29

    Anh sẽ giải thích rõ hơn về TEntity. Trong LINQ khi em thực hiện các câu truy vấn, em sẽ nhận được một tập kết quả, kết quả đó là một tập hợp nhiều đối tượng. LINQ sẽ dùng các kiểu riêng để mô tả tập kết quả đó, vì kiểu dữ liệu (của các thực thể) do tập hợp này chứa có thể khác nhau cho từng kết quả truy vấn, vậy nên .NET sẽ gọi chung nó là TEntity (chính xác là <TEntity>).
    TEntity không chỉ đến một kiểu cụ thể nào, điều này này chỉ có thể xác định được khi chạy chương trình, tuy nhiên vì các đối tượng đó vẫn là đối tượng bình thường nên em vẫn có thể dùng nó như đối với các kiểu dữ liệu khác.

    vd (VB):
    Dim students = From std In db.Students Where std.Id = “xxxxxxxxxxxx”
    For Each student In students
    PrintStudentInfo(student)
    Next

    ….
    Private Sub PrintStudentInfo(ByVal student As MyProgram.Db.Student)
    Console.WriteLine(String.Format(“ID: {0}”, student.Id))
    End Sub

    Ở đây thực chất MyProgram.Db.Student chính là TEntity, biến db.Students (với Students đại diện cho một bảng trong CSDL) thực chất được khai báo là: System.Data.Linq.Table.

  5. duckman said, on 14/01/2009 at 18:15

    Cám ơn anh Nam đã trả lời câu hỏi của em rất chi tiết. Nhưng chưa đáp ứng được nhu cầu của em (^_^). Hay là để em nói nhu cầu của em để anh tham khảo thử nhé. Theo như em được biết thì công ty nào cũng có viết 1 framework riêng cho mình. Nhưng trước khi ra đời LinQ To SQL thì framework đó được viết kết hợp với SQL ví dụ như hàm Insert database chúng ta khai báo như sau (trong đó HashTable giữ giá trị chẳng hạn, còn TableName là tên table muốn insert):

    Public void InsertNewRow(HashTable Values, string TableName){}

    Vậy thì nhu cầu bây giờ em cũng muốn viết lại 1 class connection sử dụng LinQ To SQL. Class Connections khai báo như sau //truyền datacontext vào class:

    public class connectionwhere TDatacontext : DataContext{}

    Chẳng hạn như giờ chúng ta viết 1 hàm là Load_Data_To_DataGridView thì hàm này sẽ căn cứ và đối tượng DataGridView và Tentity để Load dữ liệu lên DataGridView. Ý ở đây là chúng ta viết hoàn toàn động, ví dụ như người dùng chỉ cần gọi hàm connect.Load_Data_To_DataGridView( datagirdview1, TEntity ) //mã giả. Thì class connecttions của mình tự động load dữ liệu lên DataGridView.

    Có vài câu hỏi ngoài lề 1 chút nhé anh: anh Nam đang làm việc và sinh sống tại nơi nào?Em muốn mời anh đi uống café trao đổi và cám ơn anh.Giới thiệu em là hiền 21t sinh sống và làm việc tại Tp.HCM .Em muốn đăng ký học 1 khóa lập trình viên quốc tế, không biết nơi nào học chất lượng và thời gian học chỉ 1 năm thôi. Thân chào anh, chúc anh buổi tối vui vẻ

  6. namdh said, on 14/01/2009 at 23:13

    Thực ra để gọi là một framework thì không có nhiều, hầu hết cái gọi là framework mà em nói đến thường chỉ nên gọi “tập hợp các lớp tiện ích” :)
    Về lý thuyết thì việc như em nói có thể làm được, nhưng anh tự hỏi làm vậy để làm gì ? Người ta thường viết các lớp tiện ích để thực hiện các thao tác với CSDL, giúp cho các thao tác này trở nên ngắn gọn và dễ hiểu hơn, ngay cả Microsoft cũng có các lớp hỗ trợ điều này (Enterprise Library – http://msdn.microsoft.com/en-us/library/cc467894.aspx), đó là vì các thao tác để gọi các câu lệnh SQL tương đối dài, tốn nhiều thời gian để viết. Chính LINQ to SQL được sinh ra cũng vì mục đích giúp em thao tác với CSDL nhanh chóng, và trên thực tế việc thao tác với CSDL bằng LINQ to SQL trở nên đơn giản hơn bao giờ hết. Vậy em còn cần một lớp như em nói để làm gì? Anh chắc rằng việc gọi lại các hàm kiểu như vậy sẽ không thể dễ dàng hơn LINQ, mà vẫn giữ được tính sáng sủa của câu lệnh.
    Hiện anh cũng đang sống và làm việc tại TP.HCM, còn việc học LTV thì có khá nhiều nơi dạy, nhưng đó chỉ là nơi hỗ trợ thêm cho em mà thôi, đặc biệt nếu chỉ học trong 1 năm. Kinh nghiệm của anh là chủ yếu dựa vào bản thân, đặt một kế hoạch rõ ràng, từng bước một, xác định rõ mục tiêu cần đạt trong mỗi bước và tuân thủ nó một cách tuyệt đối. Như vậy sẽ vẫn học tốt mà không phải tốn tiền :) .

  7. duckman said, on 14/01/2009 at 23:52

    hi, cám ơn anh Nam đã làm cho em rõ ràng vấn đề, có thể em hơi quá khi nói đó là 1 framework. Cũng có thể nói đó là tập hợp các lớp tiện ích như anh nói.Em suy nghĩ như thế này, là 1 LTV thì chúng ta cũng biết rằng quá trình lặp đi lặp lại rất mất thời gian, vì thế em muốn cho ra đời 1 class – có thể đáp ứng được 1 phần nào đó công việc, giúp cho LTV tăng năng suất và hiệu quả. A thử tưởng tượng 1 điều như thế này nhé : đối với những Form đơn giản ko cần nghiệp vụ nhiều, chúng ta gọi hàm Add, Insert, Delete, hoặc Load data thì class này có nhiệm vụ tự động thực hiện dựa vào design của chúng ta.Hi, đó là do em suy nghĩ, ko biết ý kiến a như thế nào??

    Vâng em hiện nay cũng đang là LTV tại http://www.dps.com.vn, kinh nghiệm của em hiện nay cũng là do bản thân là chính, em cũng vẫn luôn đặt ra những tiêu chí, và thực hiện nó, nhưng cũng không phải lúc nào cũng có thể đánh giá nó đã đạt những tiêu chuẩn chưa? Chính vì thế em muốn đi học hỏi thêm về bên ngoài để có những cái nhìn mới về vấn đề.

    Cám ơn anh về những chia sẽ, chúc anh buổi tối vui vẻ, hạnh phúc bên gia đình.Anh có thể cho e nick yahoo hay điện thoại của anh, khi nào cuối tuần rãnh rỗi e có thể mời anh đi uống cafe trao đổi nhiều hơn nữa.

  8. namdh said, on 15/01/2009 at 11:46

    Tất nhiên là các hàm tiện ích như vậy sẽ luôn giúp em tiết kiệm công sức khi phát triển phần mềm, LINQ cũng như vậy. Chỉ có điều nếu em viết chương trình LINQ, thì các lớp tiện ích sẽ tiếp cận theo một cách khác, nó sẽ chỉ nhắm vào cách xử lý dữ liệu, binding, chứ không nhắm vào việc load/insert/change data.
    Nick yahoo của anh là daohainam, nếu add vào thì em nhớ tự giới thiệu, thường add vào mà không nói gì là anh không Accept đâu :) .

  9. Minh Tâm said, on 11/02/2009 at 12:52

    oh, anh Nam cho em hỏi xíu!
    Vậy hiệu năng truy xuất dữ liệu giữa một ứng dụng sử dụng linq và môt ứng dụng truyền thống khác thì liệu cái nào sẻ nhanh hơn?, và thêm 1 câu nữa là: có cách nào để kiểm tra hiệu năng của một truy vấn không ? :D

  10. namdh said, on 16/02/2009 at 13:56

    Để kiểm tra thì chắc chỉ có cách chạy nó thôi :)
    Về hiệu năng thì rõ ràng cách truy cập trực tiếp là nhanh hơn rồi, nhưng có nhiều ứng dụng mà hiệu năng lại không quan trọng lắm.

  11. vo chi nam said, on 02/04/2009 at 15:02

    chào anh nam . rất vui được lam quen với anh. sau khi đọc xong bài trả lời của anh em sang ra nhiều điều. anh có tài liệu về thàng linq cho thể cho em được ko?

  12. namdh said, on 02/04/2009 at 15:03

    Em có thể vào đây để tải về các sách dạy LINQ: http://namdh.wordpress.com/2008/12/04/linq-book/

  13. longnhan said, on 08/05/2009 at 00:06

    Chào anh Nam.
    Cho em hỏi cách kết nối nhiều bảng dữ liệu với nhau thì cú pháp truy vân linq như thế nào?

  14. Thanh said, on 15/05/2009 at 14:58

    Chao ban

    cho minh hoi neu dung LINQ, trong truong hop select dynamic column name thi phai lam sao

    Thanks

  15. Khách said, on 19/05/2009 at 11:57

    Anh ơi cho em hỏi. Theo giới thiệu thì dùng LINQ có thể truy cập vào nhiều kiểu dữ liệu khác nhau như XML, SQL server, … bằng chung một loại cú pháp. Nhưng sao lại chia LINQ ra thành nhiều loại như LINQ to SQL, LINQ to XML, LINQ to Object. 2 điều này em thấy mâu thuẫn nhau quá

  16. namdh said, on 19/05/2009 at 13:08

    Nếu danh sách cột thay đổi, câu lệnh cũng phải thay đổi. Nếu vẫn là các cột đó, nhưng trả về với tên khác nhau (dùng SPROC), tốt nhất bạn nên sửa lại SPROC…
    Bạn có thể nói rõ hơn yêu cần, tôi sẽ tìm giả pháp giúp bạn.

  17. namdh said, on 19/05/2009 at 13:19

    Em cứ tưởng tượng giống như ADO.NET. Trong đó cũng có 2 phần, 1 phần dùng chung (IDbCommand, DataTable, DataSet…) cung cấp 1 giao diện chung thống nhất, không phụ thuộc vào loại CSDL đang dùng là gì, phần còn lại cung cấp các lệnh riêng biệt cho từng loại CSDL (SqlCommand, SqlConnection…).
    LINQ cũng vậy, LINQ cung cấp 1 giao diện chung, cho phép chúng ta có thể dùng “cú pháp LINQ” để viết lệnh trong các chương trình C# hay VB.NET. Nhưng các câu lệnh này khi thực thi cần truy xuất vào 1 loại nguồn dữ liệu nào đó thì module truy xuất dữ liệu tương ứng (như LINQ to Objects, LINQ to SQL) sẽ được dùng.

  18. YOon_ said, on 25/05/2009 at 11:25

    Chào anh !! hôm trước em có hỏi anh về ưu điểm – khuyết điểm của LINQ (LINQ to SQL) . Anh bảo em vào đây tham khảo nhưng em chả thấy gì cả :) ) . Anh có thể tổng hợp giúp em được ko ạ ?

    Nhân tiện, anh cho em hỏi luôn về thuộc tính “delay loading” của các trường trong 1 bảng (1 đối tượng). Trong 1 số tài liệu cũng có nói qua là : thuộc tính này cho phép chỉ load dữ liệu của trường đó khi được gọi cụ thể . Nhưng mà do không có ví dụ nên em cũng ko nắm rõ được .
    Rất mong anh giải quyết giúp em !! thanks nhiều :D

  19. namdh said, on 25/05/2009 at 12:12

    Delay Loading là thuộc tính cho phép em chỉ ra là có đọc dữ liệu từ cột tương ứng vào đối tượng khi đối tượng đó được nạp hay không hay không, thuộc tính này mặc nhiên được tắt với các thuộc tính bình thường, và được bật nếu đó là một cột quan hệ, ví dụ các cột Products, Categories…
    Em có thể bật/tắt bằng cách chọn cột đó rồi đặt lại giá trị cho nó trong cửa sổ Properties.
    Ở bài 2, anh cũng có nói về nó: http://namdh.wordpress.com/2008/11/07/linq-to-sql-part-2-modeling-classes/

    Còn ưu nhược điểm của LINQ, thì em tham khảo bài Hỏi đáp LINQ nhé

  20. YOon_ said, on 27/05/2009 at 20:10

    Anh ơi , về cái lazy loading , anh xem lại cho em xem cách hiểu của em như thế này có đúng không :

    Vẫn với ví dụ trường Picture trong bảng Category , ta đặt thuộc tính Delay Loader của trường Picture = true .

    NorthwindDataContext db = new NorwindDataContext();
    var cate = from c in db.Category
    select c ;

    Đến đây thì ” cate ” không chứa các giá trị của trường Picture .
    Khi ta gọi đến các trường khác như CategoryID,CategoryName thì cũng không có thay đổi gì , mà chỉ khi ta gọi đến Picture :
    ” cate.Picture ” thì lúc này dữ liệu của trường Picture mới được truy vấn từ CSDL và đưa tới cho đối tượng phải không ạ ? ( “đối tượng ” ở đây là “cate” hay là Category ạ ? )

  21. namdh said, on 28/05/2009 at 10:07

    Đúng rồi, thuộc tính Picture vẫn có đó nhưng giá trị của nó sẽ không được nạp, trừ khi có lệnh truy cập đến, và đối tượng cụ thể ở đây là cate.

  22. Anh Tú said, on 29/05/2009 at 00:46

    Anh cho em hỏi là em cài VS 2008 nhưng sao ko thấy có LINQ trong đó, sau đó có cài thêm LINQPreview (May 2006).msi nhưng vẫn không thấy LINQ đâu hết?

  23. namdh said, on 29/05/2009 at 11:05

    Để dùng LINQ, em hãy tạo 1 project (bất kỳ) rồi “Add New Item”, và chọn LINQ to SQL Classes, em sẽ có một cửa sổ LINQ to SQL Designer để có thể kéo/thả các table từ cửa sổ Server Explorer vào.

  24. Anh Tú said, on 29/05/2009 at 22:45

    anh cho em hỏi, em có đọc 1 số website thì thấy ghi là :”Để tạo một project sử dụng LINQ, bạn tạo bằng cách dùng template tại: File > New Project > C# > LINQ Preview, nó sẽ chưa nhiều template khác nhau như:

    - LINQ Console Applications
    - LINQ Windows Applications

    Nhưng sao trong VS của em không thể tạo được project dạng này.
    Ngoài ra , để tạo website dùng LINQ thì có website ghi là vào File->New Website và sau đó chọn LINQ ASP.NET Web Site Template. Nhưng sao trong VS của em không có luôn.
    Anh có thể cho em biết là làm sao có thể tạo được các project như vậy. Em xin cám ơn

  25. namdh said, on 30/05/2009 at 10:51

    LINQ là một thành phần được hỗ tợ sẵn ngay trong VS 2008, do vậy em chỉ cần làm như anh nói là có thể sư dụng được. Thực chất trong comment #21 của anh là hướng dẫn để em có thể sử dụng LINQ to SQL, còn nếu dùng những cái khác (LINQ to Objec chẳng hạn) thì em cử gõ luôn vào trong code mà không cần phải làm thêm gì cả.
    Còn LINQ Preview mà em nói đến là bản cài thêm vào cho VS 2005, được phát hành năm 2006, bản này chủ yếu để người dùng xem trước được các tính năng của LINQ (khi đó chưa phát hành chính thức). Và do vậy các tài liệu nói về nó đều đã cũ.

  26. YOon_ said, on 30/05/2009 at 17:07

    Em tìm hiểu và tổng kết được 1 vài ưu nhược điểm của LINQ :

    Sử dụng các câu lệnh ngắn gọn, dễ hiểu thay cho việc lặp lại nhiều lần những đoạn code dài của ADO.NET
    Cấu trúc câu truy vấn được kiểm tra ngay trong thời điểm biên dịch ( compile-time )thay vì kiếm tra trong thời điểm chạy ( runtime ).
    Dễ dàng viết các câu lệnh truy vấn phức tạp.
    No magic strings, like you have in SQL queries
    Intellisense
    Compile check when database changes
    Faster development
    Unit of work pattern (context)
    Auto-generated domain objects that are usable small projects
    Lazy loading.
    Learning to write linq queries/lambdas is a must learn for .NET developers.

    Mấy cái đoạn Tiếng Anh có 1 vài chỗ em đọc không hiểu lắm nên không dám dịch .
    Cái “magic string” là gì hả anh ?

    Còn về Tốc độ truy vấn em cũng không rõ . Có lần em đọc thấy anh viết là : do linq được xây dựng dựa trên ADO.NET nên tốc độ chậm .
    Nhưng trong 1 số tài liệu , em lại thấy ghi là tốc độ nhanh , và trên 1 số web cũng nói như vậy ( người ta còn nói là qua hàng nghìn thử nghiệm rút ra kết luận đó . Đây ạ :D : http://www.apexa.net/Blog/web_design_Blog_20080512.aspx )
    Ngoài ra thì cũng có ý kiến cho rằng tốc độ chậm vì nó phải tạo ra các đoạn lệnh SQL tại thời điểm runtime ..
    Người nói chậm, người nói nhanh ~~> em đau đầu, chóng mặt :( ( ( gà mà )
    Anh có ý kiến gì không ạ ?

  27. YOon_ said, on 30/05/2009 at 17:15

    À, em thấy còn nhược điểm là LINQ mới chỉ kết nối được với SQL .
    Nhưng mà khi em search thì thấy cũng có nhiều thư viện hỗ trợ tới các CSDL khác như : oracle, mySQL .. ( hình như nó được xây dựng bởi các công ty, tổ chức khác :-? )

  28. namdh said, on 31/05/2009 at 16:22

    - Magic string chỉ đến các chuỗi có chứa ký tự đặc biệt ‘ (dùng làm phân cách chuỗi trong câu lệnh SQL), khái niệm magic string thường được dùng khi nói đến SQL Injection.
    - Về tốc độ, khi nói nhanh hay chậm, ta cần phải chỉ rõ nhanh hay chậm so với cái gì :) , tất nhiên là ở đây anh sẽ nói đến so với việc dùng trực tiếp ADO.NET (tức dùng “pure” SQL).
    LINQ to SQL là một phần của LINQ hỗ trợ việc truy vấn CSDL SQL, do vậy tất nhiên nó cũng sẽ dùng ADO.NET để truy cập dữ liệu, bằng cách sinh ra các câu lệnh SQL. Về lý thuyết, nếu em viết một câu lệnh SQL giống hệt câu lệnh động do LINQ to SQL sinh ra thì tốc độ sẽ tương đương, còn nếu em viết câu lệnh SQL tệ hơn câu lệnh động thì chắc chắn câu SQL của em sẽ chạy chậm hơn, đó là điều bình thường mà.
    Em cứ tưởng tượng thế này, để truy cập vào CSDL, em sẽ phải gửi các câu lệnh SQL đi qua tầng ADO.NET, có thể câu lệnh đó do em viết ra, cũng có thể do LINQ sinh ra. Do vậy sự khác nhau, nhanh hay chậm là do câu lệnh đó được viết thế nào. Đó là xét về tốc độ, còn tất nhiên nếu xét về khả năng tùy biến thì dùng trực tiếp ADO.NET sẽ cho em khả năng kiểm soát cao nhất, do vậy em có thể tối ưu hoàn toàn từng câu lệnh một.
    Một ví dụ về điều này là: Khi kéo thả các bảng vào trong LINQ to SQL designer, em có thể chọn để load một cột nào đó ngay khi truy vấn hay không (Lazy loading), tuy nhiên, nếu một cột đã là lazy thì lúc nào cũng là lazy. Còn nếu em không dùng LINQ thì rõ ràng mỗi chỗ khác nhau em sẽ chọn 1 cách tải dữ liệu (vì dùng các câu SQL khác nhau). Rõ ràng là em có thể kiểm soát các câu SQL do em viết dễ dàng hơn dùng thông qua LINQ to SQL, đó cũng là một trong những lý do quan trọng mà việc dùng trực tiếp ADO.NET nhanh hơn LINQ to SQL.
    Nếu nhưng thao tác mà chương trình của em thực hiện là đơn giản, chỉ bao gồm các thao tác SELECT/UPDATE/DELETE… đơn giản trên các tập dữ liệu nhỏ thì dùng hai cái thường sẽ không dẫn đến nhiều khác biệt.
    - Các provider cho LINQ khác có rất nhiều, nhưng tất nhiên là đều của 3rd party.

  29. namdh said, on 31/05/2009 at 17:39

    Thêm nữa, trong bài viết mà em nói đến, người ta đang nói về các hệ CSDL với hàng trăm bảng và business logic vô cùng phức tạp, vậy nên người ta không dùng LINQ to SQL (hay một trình ORM nào khác) cũng là điều dễ hiểu.

  30. YOon_ said, on 01/06/2009 at 10:46

    Em cảm ơn anh nhiều ạ :D

  31. kimloi said, on 01/06/2009 at 16:09

    Anh nam ơi,vì sao mình không dùng add on ADO.Net entity framework vào trong Visual studio thì đỡ phải viết câu lệnh LINQ.

  32. namdh said, on 02/06/2009 at 14:05

    Đâu có cách nào không phải viết lệnh truy vấn đâu em?

  33. YOon_ said, on 10/06/2009 at 10:08

    Anh cho em hỏi là
    sau khi đã kéo các bảng vào LINQ designer. trong SQL, khi mình thay đổi cấu trúc bảng

    vd : trong bảng product thêm trường description .

    Khi đó thực thể trong LINQ không tự động cập nhật được thuộc tính này. Mỗi làn như thế, em lại phải xóa và kéo product lại.

    Có cách nào để giải quyêt điều này ko ạ ?

  34. namdh said, on 11/06/2009 at 14:23

    Không có cách nào khác em ạ, tuy nhiên vì các thay đổi thường đều được thực hiện trên các lớp partial nên việc xóa-tạo lại không ảnh hưởng trên những gì em viết thêm, trừ những thay đổi trên thuộc tính của các bảng/cột.

  35. huy said, on 25/06/2009 at 09:31

    cho minh hoi.
    LINQ to SQL có được hỗ trợ ở phiên bản tiếp theo của visual studio ko

    hiện tại LINQ to SQL chỉ hỗ trợ trên SQL SERVER

  36. namdh said, on 25/06/2009 at 14:53

    - LINQ to SQL được hỗ trợ trong .NET 3.5 trở lên.
    - LINQ to SQL là thành phần hỗ trợ SQL Server. Nếu muốn dùng các provider khác, bạn có thể xem tại: http://code2code.net/DB_Linq/ hoặc http://www.codeplex.com/LinqToOracle (mình chưa dùng).

  37. YOon_ said, on 08/07/2009 at 15:24

    Anh ơi !! cho em hỏi 1 chút về C# ( window form ) :

    anh cho em hỏi rằng : 1 chương trình muốn quản lý Video thì làm như thế nào? Có thể đưa video đó vào lưu trữ trong db sql ko ? Và trong chương trình C# có thể play các file video đó ko ?

    em cảm ơn nhiều !!

    Mặc dù ko liên quan đến LINQ nhưng em xin phép được hỏi ở đây ạ !! ( vì em chẳng biết phải post bài ở đâu :D )

  38. namdh said, on 15/07/2009 at 14:59

    Lưu trữ video vào CSDL thường thì không hiệu quả, trừ khi bạn đang dùng một CSDL chuyên biệt cho việc này. Ví dụ như Oracle Intermedia hay dùng FILESTREAM trong SQL Server 2008. Bản thân các CSDL này cũng thường lưu trữ các loại dữ liệu lớn này theo dạng file-based, chứ không chứa trong các file dữ liệu chung như bình thường.
    Điểm quan trọng nhất là nguồn dữ liệu của bạn phải có khả năng streaming, như vậy thì việc truy cập mới đủ nhanh và hiệu quả.

    Nếu chỉ là chương trình quản lý cá nhân thì chỉ nên lưu video vào các file, chương trình chỉ quản lý thông tin và vị trí các file đó, điều này cũng dễ lập trình và không yêu cầu nhiều tính năng cao cấp.

  39. Tuấn said, on 25/08/2009 at 23:46

    Cho em hỏi về cú pháp Linq
    Product product=db.Single(p=>p.ProductName==”Toy 1″)
    Cho em hỏi phương thức Single ở trên có ý nghĩa như thế nào hả anh Nam??

  40. namdh said, on 26/08/2009 at 09:31

    Phương thức Single trả về kết quả đầu tiên và là duy nhất trong tập product. Nếu không có hoặc có nhiều hơn 1 kết quả thỏa mãn biểu thức lambda p=>p.ProductName==”Toy 1″ thì nó sẽ phát ra exception.
    Nôm na toàn bộ câu trên là lấy về product có tên là Toy 1.

  41. karakifun said, on 28/08/2009 at 17:24

    cho e hoi, muon lay 1 gia tri lon nhat cua cột đó thì lam sao, ví dụ em có 1 cột là số thứ tự kiểu int, giờ em muốn lấy số lớn nhất trong cột đó, thì viết thế nào, e dùng hàm max trong linq, nhung ko duoc


Để lại hồi âm