Hỏi đáp LINQ


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

6. LINQ và LINQ to SQL liên quan gì với nhau?

LINQ là một tập hợp các công nghệ cho phép bạn thay đổi cách truy xuất vào các nguồn dữ liệu ngay từ cấp độ ngôn ngữ, các câu truy vấn LINQ có dạng tương tự SQL. LINQ hỗ trợ hầu hết các dạng nguồn dữ liệu khác nhau, bao gồm cả các đối tượng trong bộ nhớ (LINQ to Objects), XML (LINQ to XML), CSDL SQL Server (LINQ to SQL)…

Như vậy LINQ to SQL là phần hỗ trợ việc truy cập vào CSDL SQL Server sử dụng LINQ.

7. So sánh LINQ to SQL với Entity Framework:

Bạn xem bài viết tại đây: https://namdh.wordpress.com/2010/06/30/comparing-linq-to-sql-and-ado-net-entity-framework/

8. Tôi muốn lập trình LINQ với các CSDL khác SQL Server thì phải làm thế nào?

Bạn có thể dùng LINQ với Oracle nhờ LINQ to Oracle: http://linqtooracle.codeplex.com/

Bạn cũng có thể tham khảo DbLinq Project: http://code2code.net/DB_Linq/

9. Biểu thức Lambda là gì?

Bạn có thể đọc bài viết về lambda tại đây: https://namdh.wordpress.com/2009/07/22/lambda-expression/

10. Tôi chỉ muốn trả về một tập giới hạn các cột cần thiết thì phải viết thế nào?

Thông thường, để trả về đối tượng chứa toàn bộ các cột trong bảng, bạn viết:

var r = from c in myContext.Customers select c;

Để lấy về một số cột cụ thể nào đó, bạn có thể viết:

var r = from c in myContext.Customers select new {c.Id, c.Name, c.Address};

Bạn cũng có thể dùng lại một lớp đã khai báo từ trước:

var r = from c in myContext.Customers select new CustomerInfo {Id = c.Id,  Name = c.Name, Address = c.Address};

11. Trong ví dụ trên, tôi thấy biến được khai báo bằng var, vậy var là gì?

Bạn có thể xem bài viết về từ khóa var tại đây: https://namdh.wordpress.com/2011/04/26/var-keyword/

12. Tôi muốn xem các ví dụ về LINQ to SQL, tôi có thể tìm ở đâu?

Bạn có thể tham khảo tại đây: http://msdn.microsoft.com/en-us/vbasic/bb688085.aspx

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

199 thoughts on “Hỏi đáp LINQ

  1. 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.

  2. 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.

  3. 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.

  4. 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ẻ

  5. 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🙂.

  6. 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.

  7. 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🙂.

  8. 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 ?😀

  9. Để 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.

  10. 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?

  11. 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?

  12. Chao ban

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

    Thanks

  13. 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á

  14. 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.

  15. 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.

  16. 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😀

  17. 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ó: https://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é

  18. 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 ạ ? )

  19. Đú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.

  20. 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?

  21. Để 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.

  22. 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

  23. 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ũ.

  24. 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 ạ😀 : 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 ạ ?

  25. À, 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😕 )

  26. – 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.

  27. 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.

  28. 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.

  29. 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 ạ ?

  30. 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.

  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

  32. 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😀 )

  33. 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.

  34. 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??

  35. 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.

  36. 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

  37. Anh Nam ơi cho em hỏi về chuỗi kết nối trong Linq.

    Tại sao mỗi khi em cop chương trình từ máy bạn về máy của mình thì lại phải xóa file .dbml đi và tạo mới lại thì mới chạy được. Nếu không thì lỗi không chạy được. Mặc dù em đã thay đổi lại chuỗi kết nối trong file app.config rồi.

    Vậy làm thế nào để khi đến máy khác thì không cần phải tạo lại file .dbml nữa mà chỉ cần thay đổi chuỗi kết nối thôi là được giống như kết nối bằng sql vậy.

    Anh giúp em nhé. Vì em sợ nếu thế này thì khi đóng gói chương trình lại thì không thể kết nối dữ liệu được

  38. Vì chuỗi kết nối được lưu trong file nên em phải xóa tạo lại, nếu muốn mang đi đâu cũng được thì em phải lưu chuỗi kết nối đâu đó, có thể dùng trong file app.config cũng được. Khi tạo đối tượng context thì nhớ truyền chuối đó vào, ví dụ:

    string conn = “Server=.;Database=db;…”;
    MyDBContext ctx = new MyDBContext(conn);

  39. Em cảm ơn anh. Vậy là em đã làm được rồi.
    Em muốn hỏi anh 1 số vấn đề sau:
    1. Anh Nam ơi, em sử dụng Linq cho Winform. Em muốn hỏi anh là khi đóng gói
    phần mềm và triển khai thì dùng Linq có ổn không ạ. Nó có xảy ra lỗi gì
    không ạ?

    Vì Linq nó hỗ trợ nhiều thứ và nó tự động sinh code nên em sợ khi triển khai
    ứng dụng thì dễ bị phát sinh lỗi. Thường những cái hỗ trợ tối đa như vậy
    thường không được an toàn cho lắm.

    2. Em có xây dựng Store bằng SQL nhưng khi em kéo Store sang file .Dbml thì
    có một số Store thì kéo thả được, nhưng có Store lại không thể kéo sang
    được. Em không hiểu sao lại như vậy.

    3. Trong Linq có nhiều kiểu trả về: ISingleResult, IEnumerable, IEnumerator,
    List,….
    Em muốn lấy dữ liệu để hiển thị lên GridView thì nên dùng kiểu nào hả anh.
    Kiểu nào sẽ tối ưu hơn cả.

  40. 1. Khi đóng gói và triển khai bình thường không có vấn đề gì, vì LINQ đã là một phần của .NET Framework nên em sẽ không cần cài thêm bất cứ gì khác.
    2. Em kiểm tra xem các sp đó có gì đặc biệt không, thực ra anh ít dùng sp chung với LINQ nên cũng chưa bị vậy bao giờ.
    3. Nếu hiển thị lên GridView thì em phải dùng kiểu nào cho phép chứa/duyệt nhiều phần tử. IEnumerable, IEnumerator, List đều có thể dùng được và đều liên quan đến nhau, bản thân List cũng chính là IEnumerator, còn IEnumerable cho phép em lấy về một IEnumerator, chứ em không duyệt được ngay trên IEnumerable. Ngay bản thân ITable cũng là một IEnumerable.
    Nói túm lại là mấy cái đó tuy 2 mà một nên dùng cái nào cũng được.

  41. Chào anh Nam,
    Em có vấn đề này muốn hỏi, ví dụ ta có bảng Category, em chỉ muốn trả về 2 column CategoryId và CategoryName ,
    [?] GetAllCategory()
    { NorthwindDataContext db = new NorwindDataContext();
    var categoryValue= from c in db.DataContet
    select new { c.CategoryId, c.CategoryName};
    return categoryValue;
    }
    Vậy để return về categoryValue này thì làm sao anh, nó giờ thuộc kiểu ‘a, [?] ~> em để kiểu gì giờ anh

  42. Em xem trong phần comment của bài LINQ to SQL phần 1 có trả lời cho thắc mắc của em đấy.

  43. Các bạn cho mình hỏi một chút :
    Trong LinQ : Em có vD như sau :

    NorthwindDataContext northwind = new NorthwindDataContext();

    var query = from p in northwind.Order_Details
    where p.Product.ProductName == “Camembert Pierrot”
    select p;

    Trong VD này ta sẽ lấy ra tất cả record trong bảng “Order_Details”

    Bây giờ nếu ta muốn lấy 3 field thôi VD : UnitPrice, Quantity, Discount thì ta phải làm sao ?

  44. Các bạn cho mình hỏi một chút :
    Cũng trong VD trên :

    Nhưng bây giờ dữ liệu cần lấy ra từ 2 bảng là Product và Category nhưng trong bảng Product ta chi lấy : ProductID, ProductName và trong Category ta chỉ lấy : CategoryName

  45. Các bạn cho mình hỏi một chút :

    Trong LinQ ta có một lớp dùng chung do Microsoft đưa ra để giúp việc thực thi câu lệnh LinQ tối ưu hơn là : DynamicLibrary.cs vậy, tôi có hai câu lệnh thực hiên chức năng như nhau là lấy ra thông tin của Product có CategoryID = 3 AND UnitPrice > 3, thì làm như thế nào :

    1. Có sử dụng lớp DynamicLibrary.cs

    ?

    2. Không sử dụng lớp DynamicLibrary.cs

    ?

  46. @VIP_ITSOFT:
    var query = from p in northwind.Order_Details
    where p.Product.ProductName == “Camembert Pierrot”
    select p;

    ==>

    var query = from p in northwind.Order_Details
    where p.Product.ProductName == “Camembert Pierrot”
    select new {p.UnitPrice, p.Quantity, p.Discount};

  47. “Nhưng bây giờ dữ liệu cần lấy ra từ 2 bảng là Product và Category nhưng trong bảng Product ta chi lấy : ProductID, ProductName và trong Category ta chỉ lấy : CategoryName”:

    var pc =
    from category in categories
    join prod in products on category.ID equals prod.CategoryID
    select new { ProductID = prod.Id, ProductName = prod.ProductName, CategoryName = category.CategoryName};

  48. @VIP_ITSOFT: “Trong LinQ ta có một lớp dùng chung do Microsoft đưa ra để giúp việc thực thi câu lệnh LinQ tối ưu hơn là : DynamicLibrary.cs vậy, tôi có hai câu lệnh thực hiên chức năng như nhau là lấy ra thông tin của Product có CategoryID = 3 AND UnitPrice > 3, thì làm như thế nào “:

    1. Có sử dụng lớp DynamicLibrary.cs
    var prods = ctx.Products.Where(“CategoryID = 3 And UnitPrice > 3”);

    2. Không sử dụng lớp DynamicLibrary.cs
    var prods = from p in ctx.Products where p.CategoryID = 3 && p.UnitPrice > 3 select p;

  49. anh ơi có thể giải thích LinQ so với lập trình dataset giống và khác ở chổ nào?
    đợi phãn hồi của anh.
    Chân Thành cảm ơn

  50. làm phiền anh có thể viết 1 chương trình ứng dụng nhỏ và phân tích thực hiện để cho em hiểu sâu thêm. cám ơn anh nhiều

  51. em muốn đóng gói phần mềm sử dụng LINQ. Trong file *.dbml có thuộc tính Connection, cho em hỏi làm cách nào em có thể can thiệp vào đó để đổi connection string vì khi sử dụng phần mềm, username và password trong connection string là do người dùng chọn.

  52. Anh Nam cho em hỏi về việc update primary key.
    Giả sử ta có bảng nhân viên : MaNV varchar(10) primary key, Tên nvarchar(20)
    Như vậy làm thế nào có thể update được MaNV. ( em làm theo cách update thông thường thì báo lỗi )
    Em cảm ơn anh.

  53. Chào anh Nam

    Khi em lưu dòng dữ liệu vào sqlserver sử dùng hàm submitchange() của Linq thì lưu được nhưng có unicode thì nó bị bể font ,làm sao để lưu đúng unicode xuống được, cám ơn anh nhiều

  54. Anh ơi ! anh có thể giải thích rõ hơn từng sự kiện sau cho em được hok ạ
    OnDisposed
    OnInit
    OnLoad
    OnPreRende
    OnTextChanged
    OnUnload
    Onselectedindexchanged

    Một số sự kiện hay sd như : Onselectedindexchanged , OnTextChanged,,OnPreRende hay dùng ,nhưng em vẫn muốn anh giải thích rõ hơn về chúng, từng sự kiện một ấy ạ
    Em cảm ơn anh!

  55. em có cái store thế này: lấy 1 customer theo ID:

    ALTER PROCEDURE CustOrdersOrders @CustomerID nchar(5)
    AS
    SELECT*FROM Customer
    WHERE CustomerID = @CustomerID

    khi kéo vô ORM, em biết 2 cách để return value là Customer
    1.kéo store đó lên bảng Customer
    2.sau khi kéo vô ORM,đổi thuộc tính Return Value: (Auto-generated Type)–> Customer

    cho em hỏi còn cách nào khác để return value của cái store kia là Customer hay hok?

  56. Em đang gặp khó khăn ở câu sql này khi convert qua linq . Anh có thể giúp em được ko . Em đang rât cần :

    SELECT t.MaBT, t.TieuDe, t.NoiDungTT, t.NoiDung, t.NgayDangTin, t.HinhAnh, t.ChuThich, l.MaLinhVuc, l.TenLinhVuc
    FROM (tintuc t INNER JOIN Linhvuc l ON t.MaLinhVuc = l.MaLinhVuc)
    GROUP BY t.MaBT, t.TieuDe, t.NoiDungTT, t.NoiDung, t.NgayDangTin, t.HinhAnh, t.ChuThich, l.MaLinhVuc, l.TenLinhVuc
    HAVING (t.MaBT >= ALL (SELECT MaBT FROM tintuc WHERE (MaLinhVuc = l.MaLinhVuc)))

    Cám ơn anh nha ! Có gì gửi qua email cho em nhé !

  57. @sr thúi: cho anh hỏi tại sao em phải tìm cách khác ngoài cách em đã biết?

  58. Xin cho em hỏi, Em đang viết một chương trình quản lý, nhưng khi xử dụng datetimepicker thì không ping xuống datagridview được, nhưng khi nhập ở datagridview thì ping lên datetimepicker được, không biết em sai cái gì. Xin các anh chị chỉ giúp dùm mình, xin cảm ơn.
    Em viết theo kiểu 3 tầng.
    Tầng Data lấy bảng danh sách phiếu nhập
    public Table LayDanhSachPhieuNhap()
    {
    return dl.PHIEUNHAPs;
    }

    * Tầng control

    PhieuNhapData data= new PhieuNhapData();

    ChiTietPhieuNhapData pnData = new ChiTietPhieuNhapData();

    public void DuaPhieuNhapLenDataGridView(DataGridView dgvPhieuNhap, BindingNavigator bnPhieuNhap,TextBox txtSoPhieuNhap,Datetimepicker dtpNgayNhap,ComboBox cmbNguoiGiaoHang_NCC,ComboBox cmbMaNhanVien,
    TextBox txtTongTien,TextBox txtTienBangChu,TextBox txtKho)
    {

    //Tao Biding shource
    BindingSource bs = new BindingSource();
    bs.DataSource = data.LayDanhSachPhieuNhap();

    //Dua len datagridView
    dgvPhieuNhap.DataSource = bs;

    //Dua len bindingNavigator

    bnPhieuNhap.BindingSource = bs;
    txtSoPhieuNhap.DataBindings.Add(“Text”, bs, “SOPHIEUNHAP”);
    dtpNgayNhap.DataBindings.Add(“Value”,bs,”NGAYNHAP”);
    cmbNguoiGiaoHang_NCC.DataBindings.Add(“SelectedValue”, bs, “MANHACUNGCAP”);
    txtKho.DataBindings.Add(“Text”, bs, “KHO”);

    cmbMaNhanVien.DataBindings.Add(“SelectedValue”, bs, “MANHANVIEN”);

    txtTongTien.DataBindings.Add(“Text”, bs, “TONGTIENNHAP”);
    txtTienBangChu.DataBindings.Add(“Text”, bs, “TIENBANGCHU”);

    }

    Còn ở form Phiếu nhập thì có biến cố Load.

    PhieuNhapcontrol pncontrol = new PhieuNhapcontrol();
    private void frmPhieuNhap_Load(object sender, EventArgs e)
    {

    pncontrol.DuaPhieuNhapLenDataGridView(dgvPhieuNhap, bnPhieuNhap, txtSoPhieuNhap,dtpNgayNhap,cmbNguoiGiaoHang_NCC, cmbMaNhanVien, txtTongTien, txtTienBangChu, txtKho);

  59. anh nam oi giup do gium em cai nay voi .sao em update lai ma no ko thuc hien duoc van giu nguyen ket qua ban dau.

    <asp:DropDownList ID="DropDownList1" runat="server"
    DataSourceID="LinqDataSource3" DataTextField="CATEGORYID" DataValueField="CATEGORYID" selectedvalue='’
    >

    ma sao cai tu selectedvalue no ko hieu anh oi.

  60. Sorry em, anh khá bận nên không thể trả lời em được.
    Vả lại các vấn đề em gặp anh nghĩ không khó để tìm lời giải🙂, cố gắng em nhé.

  61. anh nam oi cho em hoi .cach do du lieu vao datalist dung linq sau vậy anh.
    co phai nhu the nay ko anh.

    ketnoidulieu_newsDataContext da = new ketnoidulieu_newsDataContext();
    var timkiem = from t in da.NEWs

    datalist1.DataSource = timkiem;
    datalist1.DataBind();

  62. -anh cho em hỏi trong sql em sử dụng câu truy vấn lấy ra nội dung tối đa 200 ký tự từ bên trái:
    select left(noidungchitiet,200) as noidungchitiet,anh,tacgia,ngaydang from tbltincongnghe
    -giờ em muốn chuyển câu truy vấn trên sang linq thì phải viết như thế nào?

  63. E chào Anh!
    Cho e hỏi:

    – E có 1 form C# có 2 chức năng Thêm mới và Kiểm tra tồn tại
    – 2 chức năng này e dùng thủ tục và hàm của sql gọi thông qua Linq
    – Khi e Thêm mới xong nhưng kiểm tra tồn tại lại ko thấy. Phải tắt đi bật lại mới thấy!

    => E phải làm thế nào để nó có thể tìm thấy đối tượng sau khi thêm mà ko cần tắt đi bật lại ạ?

    SubmitChange() chỉ cập nhật từ LinQ => SQL thôi ạ?

  64. Chào Anh.!

    Trong SQL có từ khóa “like” để so sánh gần bằng, vậy trong LinQ mình có từ khóa hay cách nào làm hok anh?

  65. @thanh tung: đúng rồi đó em
    @haiga:
    select left(noidungchitiet,200) as noidungchitiet,anh,tacgia,ngaydang from tbltincongnghe
    var tcns = from tcn in tbltincongnghe select new { noidungchitiet.SubString(0, 200), anh, tacgia, ngaydang }
    @SHINBOIZ: khi gọi SubmitChanges() thành công thì dữ liệu đã có trong CSDL, nên em cần kiểm tra lại thủ tục Kiểm tra tồn tại
    SubmitChanges() chỉ cập nhật từ Linq vào CSDL.

  66. @An: có thể dùng Like, sử dụng dấu * thay cho dấu %
    Ngoài ra cũng có thể dùng hàm String.Contains

  67. em đã đọc qua tài liệu của anh về LinQ,nhưng e vẫn chưa ngấm được nhiều cho lắm. a có ví dụ cơ bản về LinQ không ạ. a có thể shared cho em được không ạ.e cảm ơn anh nhiều

  68. anh ơi giúp em về phần LinQ trong asp.net gridview cái phần paging với sorting với😀

  69. anh nam ơi cho em hỏi.bây giờ em muốn dùng linq để kết nối cơ sở dữ liệu từ xa thông qua địa chỉ ip .thì làm như thế nào anh.giúp em với anh ơi.

  70. @NguyenAn: LINQ to SQL tutorial là ví dụ cơ bản nhất rồi em ạ, nó hướng dẫn cho người chưa biết gì mà.

    @Minh Loc: em xem bài 5 nhé: https://namdh.wordpress.com/2009/03/20/linq-to-sql-part-5-linqdatasource/

    @thanh tung: để truy cập qua IP thì em chỉ cần thay thế tên máy bằng địa chỉ IP thôi.
    vd:
    string cs = “Server=127.0.0.1;Database=Northwind;Trusted_Connection=True”;
    MyDataContext ctx = new MyDataContext(cs);

  71. anh ơi hàm group by trong linq lam như thế nào.anh có thể giúp em viết 1 câu lệnh Group by trong linq không?.em muốn trả về số lượng còn lại của mỗi item trong bang InventoryTransaction.anh giup em với.em cám ơn anh nhiều

  72. bác Nam ơi cho cháu hỏi login bằng linq vd:
    var login = from p in db.user_profiles
    where p.Email.Equals(TextBox1.Text) && p.Password.Equals(TextBox2.Text)
    select p;

    Session[“thanhvien”] = login;

    vậy muốn lấy thông tin thành viên thì làm sao đây bác ^^
    thường thì cháu dùng (datatable)session[“thanhvien”] nhưng giờ thì ko dc rồi.

  73. mới tìm ra được cách này nhưng ko biết bác có cách nào đem hết vô 1 cái session ko , cháu nghĩ nếu đem hết vô 1 session thì sẽ tạo đối tượng và khi lấy ra thì phải ép kiểu đối tượng thanhvien cho session nhưng làm wai` ko dc. nho` bac huog dan vay =,=

    var user = (from u in db.Users

    18 where u.Username == Login1.UserName

    19 && u.Password == Login1.Password

    20 select u).SingleOrDefault();

    21

    22 if (user != null)

    23 {

    24 e.Authenticated = true;

    25 Session[“ChatUserID”] = user.UserID;

    26 Session[“ChatUsername”] = user.Username;

    27 }

  74. anh nam oi trong c# 2010 đã tích hợp crystal report chua anh.em dung ban beta 1 nen chua có.hiện tại bây giờ thì đã có chưa hả anh.

  75. @lộc: không biết bạn bao nhiêu tuổi mà gọi bác xưng cháu thía?😀
    Bạn hoàn toàn có thể tạo 1 đối tượng LINQ (như user_profile), gán cho nó các giá trị rồi đưa vào Session.
    Tuy nhiên Session không phải kho chứa dữ liệu nên không nên đưa quá nhiều dữ liệu vào đó, và thực ra cũng không có nhiều loại dữ liệu cần thiết phải để trong Session. Cách làm như bạn (đưa username, userid vào session) theo tôi nghĩ là phù hợp.

  76. anh nam à làm sao mình có thể gọi chương trình word được hả anh.ví dụ như trong phân hướng dẫn sử dụng chương trinh em click vào đó thì nó hiển thị trang word đó.em dùng c# anh à.anh giúp cho em với

  77. à còn phần em muốn nhờ anh nữa là mình muốn xuất dữ liệu từ sql ra excel.em dùng c# luôn anh à.nếu mình nhấn nút xuất ra excel thi dữ liệu đổ vào excel hết.anh giúp em với.

  78. Các comment của bạn có vẻ như hơi vượt quá phần nội dung của bài viết rồi🙂

  79. anh nam ơi mình làm linq to sql thì khi làm report có bị sao khong hả anh.em mua đĩa về rồi cài thì củng có nhưng khi add vào thì lại không có ha anh.nó báo là phải dowmload trên mạng về

  80. anh nam cho em hỏi làm sao để lưu tiếng việt vào sql khi dùng linq vậy trước đây khi lưu bằng cách cũ thì có thể thêm n trước chuỗi cần lưu còn linq thì … bó tay

  81. LINQ cũng như .NET hoàn toàn hỗ trợ Unicode, nên không cần làm gì cả

  82. LinQ khó we’ cho em hỏi cái đoạn code này ko biết sai chỗ nào mà nó vẫn ko chạy ra >.<

    var dbcomment = from c in db.Comments
    join mc in db.user_profiles on c.MemberID equals mc.MemberID
    where c.EventID.Equals(eventid)
    select new
    {
    Name = mc.Name,
    Date = c.Date,
    ContentComment = c.ContentComment
    };

    DataList1.DataSource = dbcomment;
    DataList1.DataBind();

    chạy F10 thấy datasource có dữ liệu rồi mà vẫn ko bind ra được , nếu để select c thì bind ok. nhưng mà ko lấy được cái Name =,=

  83. Nếu đã lấy được dữ liệu vào DataSource thì em kiểm tra xem các column của Object trả về có giống các column được khai báo trong DataList1 không

  84. ko biết anh Nam đã gặp wa vấn đề này chưa em có 2 rows trong 1 table khi select theo ngày tháng thì 1 cái ra 1 cái thì ko ra mặc dù đúng cú pháp😐
    vd select * from a where date = ’12/12/2010′ trong csdl có ngày này nhưng ko select được, dòng này được được nhập từ ứng dụng còn nếu nhập thẳng vào csdl thì nó select lại ra. em thấy dữ liệu nhập vào bằng phần mềm và bằng trực tiếp chẳng khác j`.

    [IMG]http://farm3.anhso.net/upload/20100805/15/o/anhso-155651_1.jpg[/IMG]
    [IMG]http://farm3.anhso.net/upload/20100805/15/o/anhso-155632_3.jpg[/IMG]
    [IMG]http://farm3.anhso.net/upload/20100805/15/o/anhso-155628_2.jpg[/IMG]

  85. anh cho em hỏi tại sao nhiều lúc em truy vấn, thao tác mà chương trình gặp lỗi không thể tiếp tục thực hiện thì database của em lại mất (chỉ có database các table mất hết). Có cách nào để không mất dữ liệu không?

  86. @Ân: em nên kiểm tra lại code đi, nếu không có lệnh xóa thì table vẫn còn đó, không thể mất đi đâu được.

  87. @Khách: có lẽ 2 dòng của em khác nhau ở phần % giây. Khi nhập bằng tay, chắc em không chỉ ra giá trị của % giây, nhưng khi nhập bằng phần mềm, ví dụ dùng DateTime.Now trong .NET hay GETDATE() trong SQL thì giá trị % giây được đặt tự động dựa trên thời gian hiện tại.

    Sửa lại tương tự như sau xem: where Date = ‘8/4/2001 10:10:10.123’

  88. Anh Nam cho em hỏi 2 vấn đề về LINQ được không ạh?
    1. Làm sao để insert dữ liệu vào 2 bảng có quan hệ 1:1?
    2. Em dùng Visual Studio 2010 để generate ra 1 file dbml thể hiện Data Model mà em sử dụng trong chương trình. Nhưng em muốn customize lại 1 chút, đó là thêm vào 1 abstract class để làm lớp cha cho 2 class con kế thừa thì phải làm thế nào? Cụ thể là abstract superclass BaseObject có 2 property: id và name. Em cho 2 subclass Person và Company kế thừa từ BaseObject. Nhưng dĩ nhiên BaseObject là 1 abstract class nên em không tạo table cho nó, trong khi 2 table PERSON và COMPANY thì vẫn có đầy đủ 2 column id và name cho mỗi table. Bởi vậy khi generate cái LINQ2SQL class (file dbml), em không abstract được 2 thuộc tính đó. Rất mong được anh Nam hướng dẫn vấn đề này, em xin cảm ơn rất nhiều ạh.

  89. 1.Trong SQL em làm sao thì LINQ em làm vậy.
    2. Em có thể giải thích lý do em muốn làm vậy không?

  90. Dạ vâng, lý do em muốn làm vậy là để cho cấu trúc object model trong chương trình nó hợp lý và dễ hiểu, vì nó áp dụng được tính thừa kế của OOP. Thứ hai là vì trong chương trình có rất nhiều object model (POCO), nếu xài thừa kế thì được, nhưng phải mapping bằng tay thì rất vất vả. Thứ 3, rất quan trọng, đó là khi có được BaseObject như trên, ta dễ dàng abstract những hàm xài chung, áp dụng được tính generic mà C# hỗ trợ. Ví dụ, thay vì ở tầng DataAccess, mỗi cái DAO của từng loại object model phải thực hiện FindById, hay FindByName thì duplicate code, lại không hay, mà ta có thể move những hàm đó sang 1 lớp dùng chung DaoUtils. Khi đó thì những hàm generic chỉ cần truyền vào loại class là được. Vì em vốn là lập trình viên Java lâu năm, nên suy nghĩ và tư duy bên đó cũng áp dụng cho bên này, nên mới nhờ anh chỉ dẫn vấn đề như trên.

  91. Thực ra mục đích của LINQ to SQL là phát triển nhanh ứng dụng với SQL Server, vậy nên việc thêm vào như em là làm phức tạp hóa vấn đề (sau khi người ta đã cố làm cho nó đơn giản).
    Người làm Java thường thích tổng quá hóa để tạo ra “một giải pháp cho tất cả các vấn đề”, còn người làm .NET lại thường cụ thể hóa cho từng trường hợp cụ thể.🙂
    Chẳng phải việc viết một câu truy vấn LINQ to SQL để tìm với Id đã rất đơn giản sao? Việc gì em phải tạo ra thêm những hàm kiểu như vậy nữa?

  92. Anh cho em hỏi khi insert thành công hay thất bại trong LINQ làm sao mình biết dc a ???

  93. anh oi cho e hoi la!
    e co 1file back up tu sql server 2005. e tao 1 file linq to sql classes sau do e connection toi file back up do ma chuong trinh bao la file do ko ton tai. em phai lam sao ha anh?
    mong a giup e voi!

  94. @Anh: Nếu không có exception thì là thành công, ngược lại là thất bại.

    @hy: Em xem lại các comment ở phía trên, anh có nói về join nhé.

    @vansy: Sao em có thể tạo connection tới file backup được? Em phải restore lại vào một database đã chứ. Còn trường hợp em muốn kết nối thẳng đến file mdf thì em phải có SQLExpress.

  95. Anh cho em hoi co cach nao ket noi store produce vao linq bang dong lenh ko. Tuc la ko phai tao store produce bang
    giao dien ay

  96. Anh cho em hoi them cai TableAttribute trong linq dung de lam gi vay anh
    cai doan ma nay co y nghia gi vay
    [Table(Name = “dbo.HOA_DON”)]
    public partial class HOA_DON
    {
    }
    co cach nao viet lai cai
    [Table(Name = “dbo.HOA_DON”)]
    trong lop HOA_DON cho de hieu ko anh?

  97. anh cho em hoi cai nay ti nha
    var u = data.ExecuteQuery(“select * from hoa_don “);
    dataGridView1.DataSource = u;
    sao cai datagridview cua em no ko xuat thong tin ra ngoai duoc vay anh (no den thui ah) huhu

  98. 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…

    Em van ko hieu “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…” la sao vay anh. Anh co the noi ro hon cho em cai cau nay duoc ko
    Em cam on anh

  99. Nghĩa là LINQ to SQL chỉ chịu trách nhiệm diễn dịch câu truy vấn của em thành câu tương ứng trong SQL Server thôi, còn việc kết nối, gửi câu lệnh, lấy kết quả thì vẫn là ADO.NET

  100. Anh Nam cho em hỏi.
    Trong SQL2k5 mình có hàm datepart để tính tuần trong tháng.ví dụ
    select datepart(ww,DueDate) as saleweek
    sum(quantity*price) as salesamount
    from SalesInvoices S ,SalesInvoicesDetail D
    where s.InvoideNo = D.InvoideNo
    Group by Date(ww,DueDate)
    Như vậy trong linq mình dùng hàm tương ứng với DatePart.

  101. Anh nam!
    Em có ListView,em muốn hiện tất cả sản phẩm mà có ký tự bất đầu bằng A.Code em viết như sao:
    var timKiem = from a in snhoa.san_phams
    where a.ten_san_pham.StartsWith(“A”)
    select a;
    ListView1.DataSource = timKiem;
    ListView1.DataBind();
    Nhưng sao nó chỉ hiện ra sản phẩm đầu tiên ah.
    Anh giúp em với!!

  102. cho em xin code tìm kiếm – truy vấn tập tin trong thư mục nào đó ứng dụng trên LINQ Windows Applications, thanks

  103. @babybasic08: em thử bỏ where xem nó có hiện hết không, anh thấy câu lệnh của em cũng đúng mà.

  104. chương trình sử dụng mô hình 3 lớp Linq:
    Thêm Sách:
    public Guid ThemSach(int id, string theLoai, string tenSach, string tacGia)
    {
    MyDataContext ct = new MyDataContext();
    Guid id = Guid.NewGuid();
    Sach sachMoi = new Sach(idSach = id, idTheLoai = theLoai, TenSach = tenSach, TacGia = tacGia);
    ct.Saches.InsetOnSubmit(sachMoi);
    ct.SubmitChanges();

    }

    khi em viết function : Delete Sach
    Public void XoaSach()
    {
    using(MyDataContext ct = new MyDataContext())
    {
    var h = from t in ct.Saches
    Select t;
    ct.Saches.DeleteOnSubmit(h);
    ct.Saches.SubmitChanges();

    }
    }
    Em sử dụng GridView để load sản phẩm, đồng thời có thêm command (Delete : giống như Hyberlink) cho từng sản phẩm (record), nhưng khi viết code cho Hyberlink Delete thì Ctrình thông báo lỗi ! anh có cách nào giúp em trong tình huống này ko a Nam! thanks a!

    Còn function Edit sản phẩm không biết viết làm sao nữa !

  105. Bác Nam ơi em trong Project của em dùng Linq để làm bị lỗi này bác xem hộ em với.
    Ở sự kiện Click của button Thêm Sinh Viên có dòng gần cuỗi là “db.Students.InsertOnSubmit(s);” thì nó không bị lỗi gì ở “db.Students” nhưng sao ở sự kiên load Form của em nó lại báo lỗi ở “db.Students” nếu lỗi thì lỗi tất chứ cấu trúc câu lệnh của em đúng mà sao nó báo lỗi. lỗi báo là
    (Error1: Could not find an implementation of the query pattern for source type ‘System.Data.Linq.Table’. ‘Select’ not found. Are you missing a reference to ‘System.Core.dll’ or a using directive for ‘System.Linq’? )

    DataClasses1DataContext db = new DataClasses1DataContext();
    private void btnAdd_Click(object sender, EventArgs e)
    {
    Student s = new Student();
    s.StudenCode = txtStudentCode.Text;
    s.FullName = txtFullName.Text;
    s.Gender = rdbGender.Text;
    s.ClassCode = cboClassCode.Text;
    s.HomeTown = txtHomeTown.Text;
    db.Students.InsertOnSubmit(s);
    db.SubmitChanges();
    }
    private void SinhVien_Load(object sender, EventArgs e)
    {
    var sv = from sinhvien in db.Students select sinhvien;
    }

  106. “Are you missing a reference to ‘System.Core.dll’ or a using directive for ‘System.Linq’?”

  107. Chẳng biết tại sao cái thư viện using System.Linq của em biến đâu mất hóa ra là thiếu cái này.hj hj

  108. Anh Nam ơi cho em hỏi chút em có xem phần “Lấy dữ liệu dùng Stored Procedure (LINQ to SQL phần 6)” của anh và có làm 1 ví dụ nhỏ thử nhưng nó báo lỗi anh ạ,anh xem giúp em với!
    Em tạo 1 stored procedure như sau.
    —————————————
    ALTER proc LoadTien
    (@ML varchar(10),@HTN varchar(10),@NH varchar(9), @Tien float output)
    as
    begin
    Select @Tien=Sotien from UnitSchoolFeeses where Malop=@ML and HinhthucNop=@HTN and Namhoc=@NH;
    return @Tien
    end
    ————————–
    Ý em là muốn lấy ra số tiền quy dịnh học phí phụ thuộc vào 3 yếu tố tương ứng với từng lớp,năm học,hình thức nộp(theo tháng hoặc quý,…).
    Ở WinForm của em trong sự kiện Click của button1 em gọi SP này như bên dưới.
    —————-
    private void button1_Click(object sender, EventArgs e)
    {
    double tien=0;
    double TIEN = db.LoadTien(“l1″,”thang”,”2009-2010″ ,ref tien);

    }
    ——————
    Nó báo lỗi 2 lỗi làm hình như báo là truyền đối số không đúng nhưng em thấy truyền đúng kiểu dữ liệu rồi mà lại báo lỗi này thật sự em potay, cả buổi tối em tìm không ra anh xem giúp em với!!(trong CSDL của em ở bảng UnitSchoolFeeses có nhập bản ghi này”l1 thang 2009-2010 10000″)ý em là muốn lấy ra số tiền 10000 đó.
    Error 1:The best overloaded method match for ‘TinhHocPhi.TuTinhHocPhiDataContext.LoadTien(string, string, string, ref double?)’ has some invalid arguments.
    Error 2:Argument ‘4’: cannot convert from ‘ref double’ to ‘ref double?’

  109. Em phải khai báo biến tiền theo kiểu nullable, tức là:
    double? tien=0; //có thêm dấu ?

  110. Em cảm ơn anh nhiều!
    em làm như anh nói thì không thấy lỗi gì.
    Nhưng anh ơi sao cái thủ tục của em lại trả về giá trị là 0 ạ đáng lẽ nó phải là 10000 chứ em thử Show nó ra thì thấy trả ra giá trị là 0 chứ không phải 10000.hay do em chưa có lời gọi thủ tục.
    mà trong bảng đó của em khẳng định chắc chắn có bản ghi này(l1 thang 2009-2010 10000)
    —————
    private void button1_Click(object sender, EventArgs e)
    {
    double tien=0;
    double TIEN = db.LoadTien(“l1″,”thang”,”2009-2010″ ,ref tien);
    MessageBox.Show(TIEN.ToString());//Nó in ra giá trị là 0

    }
    —————–
    Em thay trong ADO.net co loi goi thu tuc la EXECUTE (tên thủ tục) nhưng sao trong Linq hay trong ví dụ của anh phần”Lấy dữ liệu dùng Stored Procedure (LINQ to SQL phần 6)”không thấy anh gọi thủ tục hay Linq nó ngầm định gọi ạ(nếu không ngầm định gọi thì cấu trúc câu lệnh gọi thủ tục trong Linq thế nào ạ?)

  111. Cảm ơn em đã chia sẻ.
    Thực ra rất đơn giản phải không? Anh cố ý không trả lời để em tự tìm cách giải quyết vấn đề.
    Và chẳng phải bây giờ khi làm được em sẽ cảm thấy vui sướng hơn nhiều so với nếu anh chỉ cách làm?🙂

  112. anh Nam ơi cho em hỏi với
    trong LINQ em lấy dữ liệu từ 2 bảng thì được,
    nhưng 3 bẳng thì em không làm được anh ạ.
    ví dụ bảng A,B,C lay ra bA tu A, bB tu B, bC tu C
    anh chỉ cho em với!

  113. Đúng thật câu hỏi của em chẳng đáng là câu hỏi,nó cơ bản quá anh nhỉ tự làm thì tốt hơn,lần sau em sẽ cân nhắc trước khi Post câu hỏi lên đây.

  114. Hi a.
    Em muốn hỏi về vấn đề tìm kiếm tiếng việt không dấu và có dấu trong linQ.
    Em định xử lý bằng cách chuyển tất cả dữ liệu cần tìm và từ khóa thành tiếng việt không dấu .Sau đó sẽ tìm kiếm với Contains trong linQ
    var results = db.Users.Where(m => TVKhongDau(m.Name).ToUpper().Contains(TVKhongDau(stringInput).ToUpper()));
    Nhưng bị lỗi Method ‘System.String TVKhongDau(System.String)’ has no supported translation to SQL.

    Có cách nào để giải quyết vấn đề này không ạ?
    Thx a ạ🙂

  115. @QuyHX: cái này là do LINQ không tìm thấy cách nào để chuyển hàm TVKhongDau thành câu lệnh SQL (nó cần có một hàm SQL tương ứng).
    Giải pháp là em chuyển TVKhongDau thành 1 hàm CLR, em có thể tham khảo cách làm trong 1 bài viết tương tự sau:
    https://namdh.wordpress.com/2008/11/27/linq-tip-3/

  116. Em đã làm được rồi.Thx a ạ.
    A ơi thế có phương pháp nào để tìm kiếm tiếng việt không dấu trong LinQ nữa không a.
    Hình như cách chuyển cả tất cả thành tiếng việt nó chậm phải không ạ.

    thx a ạ🙂

  117. Với một hàm đơn giản thì rất khó để biết nó chậm hay không ngoại trừ việc cho chạy thử thật nhiều lần.
    Có cách nữa là không viết hàm CLR mà viết thẳng stored procedure rồi gọi😀

  118. Anh Nam cho em hỏi chút.
    1>Tại sao khi thiết kế csdl trong Linq tên bảng phải đặt theo quy tắc số nhiều,nếu CSDL Thiết kế bằng tiếng anh thì số nhiều được còn nếu Tên bảng bằng tiếng việt thì sao số nhiều kiểu gì ạ?

    2>Nếu không đặt tên bảng theo quy tắc số nhiều thì có sao không,sẽ không được Linq hỗ trợ hoàn toàn hay gì hả anh?
    Mong anh trả lời giúp em 2 thắc mắc trên.
    Cảm ơn anh nhiều!

  119. Việc đặt tên theo số nhiều chỉ là cách đặt tên tự động mà VS dùng thôi, không bắt buộc.

  120. anh nam cho em hỏi là khi em gán datagirdview1.datasouce=from p in db.sinhvien select p;

    thì em sửa xóa trực tiếp trên giao diện datagirdview1 mà không thêm code gì khác rồi gọi db.submitchange(); thì nó lại cập nhật cái em sửa xóa tương ứng vào sinh viên trong
    CSDL
    Vậy có phải linq dã gắn kết dữ liệu của datagirdview vào
    mô hình dữ liệu của linq to sql
    tức là em sửa xóa dữ liệu của datagirdview thì tự nó cũng sửa xóa dữ liệu thực thể sinhvien trên lớp linq to sql. có phải vậy không ạ.

  121. Mình có một bảng tbDmNoiDung trong đó có các cột:
    – idDanhMuc (int)
    – idDmCha (int)
    – tenDanhMuc
    – …
    Bây giờ mình muốn lấy idDanhMuc, tenDanhMuc và tenDmCha (tên của Danh mục cha tương ứng chứ không phải idDmCha) thì câu lệnh Linq như thế nào nhỉ. Các bạn giúp đỡ.

  122. @tienqb:from p in db.DmNoiDung join a in db.DmCha on p.idDmCha equal a.idDmCha select new{p.idDanhMuc,p.tenDanhMuc,a.tenDmCha}
    hinh nhu la vay😀

  123. Anh nam cho em hoi . cau lenh truy van trong linq tra ve gia tri true hoac false ta viet nhu the nao . Vi du e kiem tra ten ton tai sau do tra ve true con nguoc lai tra ve false

  124. Anh ơi cho em hỏi. Làm sao có thể backup và restore DB là SQL server 2008 trong C# dùng LINQ hả anh

  125. @nguyen huy: em có thể viết kiểu như sau:

    bool exists = ((from t in context.mytable where name == ‘abc’ select t).Count()) > 0;

  126. @Nguyễn Quốc Vũ: em có thể viết 1 thủ tục để gọi câu lệnh BACKUP hay RESTORE rồi gọi lại trong LINQ.
    Tuy nhiên thực tế thì LINQ to SQL không được thiết kế cho mục đích đó.

  127. load dl lên datagridview sử dụng store proceduce co tham số truyền vào trong lin q

  128. create proc spu_loadbang
    @tenbang nvarchar(50)
    as
    declare @caulenh
    set @caulenh=”
    SET @caulenh=@caulenh+’ select * from ‘+@tenbang
    exec(@caulenh)
    khi load len datagridview lam sao ha anh giúp em với!

  129. a Nam ơi cho e hỏi
    cách Databindings cho 1 ô textbox sử dụng soure là linq?
    bình thường: textbox1.databindings(“Text”,source,”ID”);
    thì với source ở trên là dataset,datable thì ổn nhưng kiểu dữ liêu tâp hơp enumerable của linq thì ko đc

  130. mình muốn tìm kiếm gần đúng trong linq thì làm thế nào, trong sql thì dùng %like vậy trong linq dùng ji. mong bạn gải đáp giúp mình sớm. thank bạn nhìu..

  131. @Lê quốc vũ: Bạn có thể import System.Data.Linq.SqlClient và dùng phương thức Like có trong SqlMethods, ví dụ:

    var users = from u in context.Users
    where SqlMethods.Like(u.FullName, “%Bill Gates%”)
    select u;

  132. anh Nam ! anh làm 1 cái demo update/delete trên datagrid WPF ( dùng data binding , update,delete là 2 column button ) dùng LINQ dc kô anh ??? ( em đang bị vướng cái update😦 )
    // nếu trong datagrid mà các column có cả combobox, checkbox,.. càng tốt😀

    thanks anh😀

  133. Bạn ơi cho mình hỏi một chút về LINQ.Mình gọi từ 1 lớp khác trả về 1 tập các kết quả product(gồm nhiều field)
    var product = from p in db.Products
    where p.Category.CategoryName == “Beverages”
    select p;
    nếu mình chỉ muốn lấy id_Product thì phải khởi tạo arraylist
    ArrayList list =new ArrayList();
    foreach (Product p in product)
    {
    list.Add(p.ProductID );
    }
    cái mình hỏi là có cách nào từ product trả về tất cả các productID không bạn? Kiểu như product.ToList().ElementAt(0).ProductID ;(cái này chỉ trả về 1 row thôi). Mình không định dùng thêm 1 thủ tục mới….select new {p.ProductID} …

  134. Bạn có thể trả về ProductID:

    var product = from p in db.Products where p.Category.CategoryName == “Beverages” select p.ProductID;

  135. Cho mình hỏi 1 chút nữa ^^ .Mình có hàm này trong DataContext
    public IList getTramByIDTram( int idTram)
    {
    return this.Trams.Single(t => t.id_Tram.Equals(idTram));

    }
    khi debug thì nó báo lỗi. Còn nếu mình dùng như thế này thì không:
    public IList getTramByIDTram(int idTram)
    {
    // return this.Trams.Single(t => t.id_Tram.Equals(idTram));
    return (from t in this.Trams
    where t.id_Tram == idTram
    select t.TenTram).ToList();

    }
    txtTram.Text = db.getTramByIDTram(idTram).Single().ToString()
    Bạn giúp mình sửa cái lỗi ở trên với >.< . Mình muốn dùng lambda cho nó gọn mà còn mơ hồ quá

  136. cho mình sửa lại là (không hiều sao khi post lại thiếu mất cụm từ )
    public IList getTramByIDTram(int idTram)

  137. Xin lỗi mình viết không được dấu kia ~.~
    public IList (string) getTramByIDTram(string idTram)

  138. Lạ nhỉ, cái trên đáng lẽ không dịch được chứ???
    Cái trên có vẻ trả về 1 đối tượng Tram đơn, còn cái dưới là một list, nếu là 1 Tram đơn thì sao có thể biến thành 1 IList được nhỉ???

  139. Cho mình hỏi ilist có thể cập nhật dử liệu vào database giống như dataset nhờ dataApter ko?Mình dùng ilist là source cho datalistview.
    Mình ko dùng nút thêm xóa sửa gì trên datalistview hết vì chỉ sửa trực tiếp trên datalistview.

  140. IList là dạng list generic, nó không có chức năng nào liên quan đến CSDL cả, nên nếu muốn cập nhật, bạn phải tự duyệt và dùng ADO.NET, EF hay một cách gì khác để cập nhật.

  141. Xin lỗi mình mới đi công tác về . Nguyên xi đoạn code của mình như thế này. MÌnh dùng lamda ko được trong trường hợp này nên ko dùng luôn ^^
    public IList getTramByIDTram(string idTram)
    {
    // return this.Trams.Single(t => t.id_Tram.Equals(idTram));
    return (from t in this.Trams
    where t.id_Tram == idTram
    select t.TenTram).ToList();

    }
    P/s: Bạn cho mình hỏi cách đổ dữ liệu từ 1 file excel vào sql server dùng linq được ko bạn. Đây là code mẫu mình kết nối csdl không dùng linq
    private DataTable ImportData()
    {
    string connectionString = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” + txtFilePath.Text.Trim() + “;Extended Properties=Excel 8.0”;
    OleDbConnection oledbConn = new OleDbConnection(connectionString);
    DataTable dt = null;
    try
    {
    //Mở kêt nối
    oledbConn.Open();
    OleDbCommand oledbCmd = new OleDbCommand(“SELECT * FROM [Sheet1$]”, oledbConn);
    OleDbDataAdapter oledbAdapter = new OleDbDataAdapter();
    oledbAdapter.SelectCommand = oledbCmd;
    DataSet ds = new DataSet();
    //Đổ dữ liệu từ file Excel vào DataSet
    oledbAdapter.Fill(ds);
    dt = ds.Tables[0];
    }
    catch (Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    finally
    {
    oledbConn.Close();
    }
    return dt;
    }
    Từ khi mình chuyển qua LINQ thì coding cực kỳ nhanh, mình muốn hỏi dùng linq trong trường hơp này được không bạn?

  142. Search thử thì thấy vài LINQ provider cho excel, ví dụ như cái này: http://xlslinq.codeplex.com/
    Mình chưa dùng bao giờ nhưng chắc cũng đơn giản thôi, dùng Excel.Linq để đọc dữ liệu, dùng LINQ to SQL để ghi vào SQL Server.

  143. Cảm ơn bạn nhiều, mình cũng google hoài mà sao không ra cái trang của bạn nhỉ ~.~. Nhân tiện mình nhờ bạn fix giùm mình cái lỗi này với. Mình làm đủ mọi cách mà ko ra(mình thay cái dấu >)
    public IEnumerable >SanLuong< getListIndexByIDDay(string sDate)
    {
    var s= (from i in this.SanLuongs
    where i.idDay == sDate
    select new
    {
    i.BinhThuong,
    i.CaoDiem,
    i.ThapDiem
    });
    return s.ToList();
    }
    nó cứ báo : Cannot implicitly convert type 'System.Collections.Generic.List’ to ‘System.Collections.Generic.IEnumerable’. An explicit conversion exists (are you missing a cast?)

  144. MÌnh làm vầy thì nó chạy được. Sory bạn nhe, mình vừa hỏi vừa google, làm phiền bạn quá
    public IList >SanLuong< getListIndexByIDDay(string sDate)
    {
    var s = (from i in this.SanLuongs
    where i.idDay == sDate
    select new SanLuong
    {
    BinhThuong = i.BinhThuong,
    CaoDiem = i.CaoDiem,
    ThapDiem = i.ThapDiem
    }).ToList();
    return s;
    }

  145. hi anh Nam!
    anh giải thích giúp em về Complie query in LINQ và có ví dụ về nó với ạ, Ví Dụ với càng nhiều Điều kiện càng tốt

  146. var query = from n in dt.PhongThues
    where n.MaPhong == txtphong.Text
    select n.NgayDen;
    dtpngayden.Value = query.Single(o => o.Date!=null);

    var query1 = from n in dt.PhongThues
    where n.MaPhong == txtphong.Text
    select n.NgayDi;
    dtpngaydi.Value = query1.Single(o => o!= null);
    ……………………………..
    Chào anh!
    Em chỉ mới tìm hiểu linq thôi ạ, em có đoạn code trên mong anh giúp em sửa lỗi.
    Như đoạn code trên, em đã đưa được ngayden có kiểu dữ liệu là datetime lên được datetimepicker dtpngayden, nhưng khi em thực hiện tương tự với ngaydi thì lại không được ạ. Mong sớm nhận được phản hồi từ anh ạ.

  147. Anh không rõ lỗi gì vì em không nói.
    Có thể là chỗ: o => o!= null nên sửa thành o => o.Date!= null

  148. Dạ, vấn đề là ở chỗ lúc e gõ o=>o. thì lại không hiện ra Date cho em chọn, mà ở ngayden thi có ạ. Em cũng đã sửa lại đoạn code như sau:
    var query = from n in dt.PhongThue
    where n.MaPhong == txtphong.Text
    select n;
    dtpngaydi.Value=query.Single(o=>o.Ng)
    foreach (var n in query)
    {
    txtphong.Text = n.MaPhong;
    txtkhachhang.Text = n.MaKhachHang;
    txttinhtrang.Text = n.TinhTrang;
    dtpngayden.Value = n.NgayDen;
    dtpngaydi.Value = n.NgayDi;
    }
    ………………..
    mọi thứ đều đưa lên được textbox, datetimepicker trên form bình thường nhưng chỉ có dòng “dtpngaydi.Value=n.NgayDi” thì báo lỗi này
    “Error 1 Cannot implicitly convert type ‘System.DateTime?’ to ‘System.DateTime’. An explicit conversion exists (are you missing a cast?) ”
    …….em không biết là bị gì ở ngaydi nữa.^^’

  149. NgayDi được khai báo NULL (NgayDen là NOT NULL) nên kiểu tương ứng là DateTime? chứ không phải DateTime.

    if (n.NgayDi != null)
    dtpngaydi.Value = n.NgayDi.Value;

  150. Em cảm ơn anh nhiều, em đã sửa được rồi. Mà em còn một thắc mắc nữa là khi em đổ cột KhachHang vào combobox cbmaloaiphong thì ở datagirdview dtphongkhachsan lại sinh thêm một cột KhachHang ghi là qlks.KhachHang. Vậy em phải làm sao bỏ cột KhachHang trên datagirdview được ạ.

    code:
    var query = from n in data.LoaiPhongs
    select n;
    cbmaloaiphong.DataSource=query;
    ………………………
    Ở trên là đoạn code mà em dùng để đổ dữ liệu vào combobox. Em cảm ơn a! ^^

  151. Cột này là cột tham chiếu từ n -> 1 của obect của em.
    Bỏ đi thì có nhiều cách, cái này em tự tìm hiểu nhé🙂

  152. a cho em hỏi là: e tạo hai textbox bang code tay, và e add hai cái textbox vào grouppanel được, nhưng làm sao e có thể tương tác với hai textbox đó. ví dụ như là e nhập dữ liệu vào hai text box và lưu nó xuống CSDL ạ.

  153. Chào anh Nam!

    Em có câu lệnh truy vấn như sau:

    var strcmd = (from s in LINQ_2.TBL_SACHes
    join mt in LINQ_2.TBL_MUON_TRAs
    on s.MA_SACH equals mt.MA_SACH
    select new
    {
    s.MA_SACH,
    s.TEN_SACH,
    s.NOI_DUNG,
    s.NGAY_NHAP,
    s.SO_LUONG_TON,
    s.SO_LUONG_MUON,
    s.HINH_ANH,
    s.MA_VI_TRI,
    s.MA_NHA_XUAT_BAN,
    s.MA_NHA_CC,
    s.MA_TAC_GIA,
    s.MA_NGON_NGU,
    s.MA_LINH_VUC,
    s.MA_THE_LOAI
    });

    Bây giờ em muốn sử dụng group by để gom nhóm theo mã sách ( mã sách thuộc bảng TBL_MUON_TRA) thì viết như thế nào? Mong anh giúp đỡ.

  154. Em có đọc bài viết của anh về LINQ và em thấy rất hay.
    Em có một vấn đề muốn hỏi anh về cách kết nối cơ sở dữ liệu từ LINQ.
    Bài viết của anh em thấy là chỉ kéo thả vào?
    Em đang sử dụng SQLITE và đang mắc ở phần kết nối này. Trong SQLITE kéo thả vào nó không nhận.
    Vậy mong anh chỉ giúp cách kết nối như thế nào với SQLITE

  155. @Khách: Vấn đề em hỏi không liên quan đến nội dung bài viết nên anh mạn phép không trả lời

  156. @Bambi:
    var strcmd = (from s in LINQ_2.TBL_SACHes
    join mt in LINQ_2.TBL_MUON_TRAs
    on s.MA_SACH equals mt.MA_SACH
    group mt by s.MA_SACH into g
    select new
    {
    MASACH = g.Key,
    MUONTRAs = g
    });

  157. @Tiệp: LINQ to SQL thì chỉ dùng với SQL Server thôi, còn nếu dùng với SQLLite thì chắc phải kiếm cái khác. Em có thể search thử xem.

  158. Chào anh Nam!

    Gom nhóm như anh thì em làm được rồi, nhưng nó chỉ lấy được cột mã sách thôi, cái quan trọng là em không lấy được các cột TENSACH, NOIDUNG, NGAYNHAP…thuộc bảng SACH. Mong anh giúp đỡ. Cám ơn anh nhiều!

  159. Anh Nam ơi cho em hỏi trong Linq em muốn select những sản phẩm mà có mã bằng 1 trong các giá trị tromg 1 mảng chứa ID khác thì làm sao hả anh?
    Nếu mảng có 1 hoặc 2 giá trị thì không nói làm gì nhưng đây mảng có nhiều giá trị trong nó.
    ví dụ:

    int[]ma={1,2,3,…};
    var sp =from a in db.product where ID in ????ma//so sánh ID nếu bằng 1 trong các giá trị trong mảng tập hợp thì lấy.
    select a;

    Cho em hỏi chỗ xử lý dấu ???? đấy anh.
    Mong nhận được câu trả lời của anh.
    Cảm ơn anh nhiều ạ!

  160. Anh cho em hỏi Cú Pháp Lấy ID của bản ghi vừa nhập xong bằng LinQ ?

  161. Anh Name cho em hỏi phần Linq to excel.làm thế nào thêm sửa ,xóa trên csdl excel mà dùng excel không anh?

  162. Chào anh, thấy topic của a nói về vấn đề Linq. Em cũng có vấn đề với cài này nên mong a giúp đỡ

    Ví dụ trong database có 2 class: Course(CourseID, Name,…), Student(StudentID, CourseID, Name, Age,…) và đặt CourseID trong bảng Student là foreign key. Khi mình sử dụng LINQ để ấy ra 1 list các Student, thì trong từng object Student của cái list đó có thêm một list object Course nữa, vì 2 bảng Course và Student có relatiobship với nhau.

    Nhưng khi em bỏ relationship giữa 2 bảng thì mình có cách nào để lấy một list các Student mà trong từng object có một list các Course giống như khi có relationship không anh?

    Cám ơn anh!!!

  163. Gửi anh Nam.
    Anh cho em hỏi khi ta thực hiện tao tác với CSDL SQL Server thông qua các Store proceduce,khi Add LINQ to SQL classe trong mục add new item của project ta chọn server kết nối và table kết nối.Vậy đều gì sẽ xảy ra nếu ứng dụng của ta chuyển qua máy khác(tức là khi develop thì trên máy mình nhưng khi triển khai thì lại triển khai trên máy chủ với server và CSDL mới)
    Thanks anh nhiều!

  164. Thanks anh Nam nhiều,em đang tìm hiểu về ASP.NET,trước đây em toàn làm winform,bây giờ chuyển qua webform cũng gặp nhiều bỡ ngỡ,rất mong được anh chỉ giáo.Thanks anh!

  165. anh ơi cho em hỏi
    //Bảng hashtable chứa hai vùng giá trị: key-lưu chỉ số củalưu giá trị trong cột
    List temp = new List();
    List fromHash = new List();
    //Chuyển từ các value trong bảng hashtable sang list để thcho việc xử lý bằng LINQ
    foreach (DictionaryEntry s in hash)
    fromHash.Add(s.Value.ToString());
    //Xử lý bằng LINQ: chọn các giá trị trong fromHash không tr
    var x = (from p in fromHash
    select p).Distinct();

  166. anh có em hỏi sao em dùng visual 2010 mà cái dòng
    var x = (from p in fromHash
    select p).Distinct();
    nó cứ báo lỗi từ ” fromHash ” là sao ah , cứ báo lỗi thiếu System.Core.dll hoặc System.Linq
    Anh sửa giúp em với ah

  167. I was recommended this web site by means of my cousin. I am now not sure whether this post is written by means
    of him as no one else understand such exact about my trouble.
    You’re incredible! Thanks!

  168. Anh oi cho em hoi sao Ham SubmitChanges trong DataconText cua em lai khong co ha anh.Anh tra loi giup em voi.em phai lam sao de co duoc ham do.???

  169. Đoạn Code sau để lấy mã học sinh tự động trước khi thêm vào danh sách học sinh trong ADO.NET.
    Các bạn cho mình hỏi: Chuyển qua LinqtoSQL thì phải làm thế nào để lấy Mã HS?
    OleDbConnection cn = DataProvider.ConnectionData();
    strSQL = “Select @@IDENTITY”;
    cmd = new OleDbCommand(strSQL, cn);
    hsDto.Ma = int.Parse(cmd.ExecuteScalar().ToString());

  170. Trong C#,khi tạo Datasource ,ta có tập tin .XSD .
    Nhưng khi Database SQL thay đổi về cấu trúc (thêm/bớt cột của một table…) thì tập tin .XSD không thay đổi theo (Điều nầy không giống với tập tin .dbml của Linq to SQL).Có cách nào khắc phục không ?.Xin Cám ơn nhiều !

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s