text:
Đây là bài viết đầu tiên trong loạt bài có chủ đề “LINQ to SQL”, các bài này sẽ cho bạn một cái nhìn khái quát, giúp bạn làm quen với LINQ, một trong những công nghệ mới có trong .NET 3.5.
Loạt bài này được dựa trên loạt Tutorial của ScottGu (http://weblogs.asp.net/scottgu).
LINQ to SQL là gì?
LINQ to SQL là một phiên bản hiện thực hóa của O/RM (object relational mapping) có bên trong .NET Framework bản “Orcas” (nay là .NET 3.5), nó cho phép bạn mô hình hóa một cơ sở dữ liệu dùng các lớp .NET. Sau đó bạn có thể truy vấn cơ sở dữ liệu (CSDL) dùng LINQ, cũng như cập nhật/thêm/xóa dữ liệu từ đó.
LINQ to SQL hỗ trợ đầy đủ transaction, view và các stored procedure (SP). Nó cũng cung cấp một cách dễ dàng để thêm khả năng kiểm tra tính hợp lệ của dữ liệu và các quy tắc vào trong mô hình dữ liệu của bạn.
Mô hình hóa CSDL dùng LINQ to SQL:
Visual Studio “Orcas” đã tích hợp thêm một trình thiết kế LINQ to SQL như một công cụ dễ dàng cho việc mô hình hóa một cách trực quan các CSDL dùng LINQ to SQL. Bài viết sau sẽ đi sâu hơn vào cách dùng trình thiết kế này (bạn cũng có thể xem đoạn video này để xem cách tôi tạo một mô hình LINQ to SQL).
Bằng cách dùng trình thiết kế LINQ to SQL, tôi có thể dễ dàng tạo một mô hình cho CSDL mẫu “Northwind” giống như dưới đây:
Mô hình LINQ to SQL ở trên định nghĩa bốn lớp thực thể: Product, Category, Order và OrderDetail. Các thuộc tính của mỗi lớp ánh xạ vào các cột của bảng tương ứng trong CSDL. Mỗi instance của một lớp biểu diễn một dòng trong bảng dữ liệu.
Các mũi tên giữa bốn lớp thực thể trên biểu diễn quan hệ giữa các thực thể khác nhau, chúng được tạo ra dựa trên các mối quan hệ primary-key/foreign-key trong CSDL. Hướng của mũi tên chỉ ra mối quan hệ là một – một hay một – nhiều. Các thuộc tính tương ứng sẽ được thêm vào các lớp thực thể trong các trường hợp này. Lấy ví dụ, lớp Category ở trên có một mối quan hệ một nhiều với lớp Product, điều này có nghĩa nó sẽ có một thuộc tính “Categories” là một tập hợp các đối tượng Product trong Category này. Lớp Product cũng sẽ có một thuộc tính “Category” chỉ đến đối tượng “Category” chứa Product này bên trong.
Bảng các phương thức bên tay phải bên trong trình thiết kế LINQ to SQL ở trên chứa một danh sách các SP để tương tác với mô hình dữ liệu của chúng ta. Trong ví dụ trên tôi đã thêm một thủ tục có tên “GetProductsByCategory”. Nó nhận vào một categoryID và trả về một chuỗi các Product. Chúng ta sẽ xem bằng cách nào có thể gọi được thủ tục này trong một đoạn code bên dưới.
Tìm hiểu lớp DataContext
Khi bạn bấm nút “Save” bên trong màn hình thiết kế LINQ to SQL, Visual Studio sẽ lưu các lớp .NET biểu diễn các thực thể và quan hệ bên trong CSDL mà chúng ta vừa mô hình hóa. Cứ mỗi một file LINQ to SQL chúng ta thêm vào solution, một lớp DataContext sẽ được tạo ra, nó sẽ được dùng khi cần truy vấn hay cập nhật lại các thay đổi. Lớp DataContext được tạo sẽ có các thuộc tính để biểu diễn mối bảng được mô hình hóa từ CSDL, cũng như các phương thức cho mỗi SP mà chúng ta đã thêm vào.
Lấy ví dụ, dưới đây là lớp NorthwindDataContext được sinh ra dựa trên mô hình chúng ta tạo ra ở trên:
Các ví dụ LINQ to SQL
Một khi đã mô hình hóa CSDL dùng trình thiết kế LINQ to SQL, chúng ta có thể dễ dàng viết các đoạn lệnh để làm việc với nó. Dưới đây là một vài ví dụ về các thao tác chung khi xử lý dữ liệu:
1) Lấy các Product từ CSDL
Đoạn lệnh dưới đây dùng cú pháp LINQ để lấy về một tập IEnumerable các đối tượng Product. Các sản phẩm được lấy ra phải thuộc phân loại “Beverages”:
C#:
VB:
2) Cập nhật một sản phẩm trong CSDL
Đoạn lệnh dưới đây cho thấy cách lấy một sản phẩm, cập nhật lại giá tiền và lưu lại CSDL.
C#:
VB:
3) Chèn thêm một phân loại mới và hai sản phẩm vào CSDL
Đoạn mã dưới đây biểu diễn cách tạo một phân loại mới, và tạo hai sản phẩm mới và đưa chúng vào trong phân loại đã tạo. Cả ba sau đó sẽ được đưa vào cơ sở dữ liệu.
Chú ý rằng tôi không cần phải tự quản lý các mối quan hệ primary key/foreign key, thay vào đó, tôi chỉ đơn giản thêm các đối tượng Product vào tập hợp Products của đối tượng category, và rồi thêm đối tượng category vào tập hợp Categories của DataContext, LINQ to SQL sẽ biết cách thiết lập các giá trị primary key/foreign key một cách thích hợp.
(Add đã được thay đổi bằng InsertOnSubmit trong phiên bản hiện tại)
C#
VB:
4) Xóa các sản phẩm
Đoạn mã sau sẽ biểu diễn cách xóa tất cả các sản phẩm Toy khỏi CSDL:
(RemoveAll đã được thay đổi bằng DeleteAllOnSubmit trong phiên bản hiện tại)
C#:
VB:
5) Gọi một thủ tục
Đoạn mã dưới đây biểu diễn cách lấy các thực thể Product mà không dùng cú pháp của LINQ, mà gọi đến thủ tục “GetProductsByCategory” chúng ta đã thêm vào trước đây. Nhớ rằng một khi đã lấy về kết quả, tôi có thể cập nhật/xóa và sau đó gọi db.SubmitChanges() để cập nhật các thay đổi trở lại CSDL.
C#:
VB:
6) Lấy các sản phẩm và phân trang
Đoạn mã dưới đây biểu diễn cách phân trang trên server như một phần của câu truy vấn LINQ. Bằng cách dùng các toán tử Skip() và Take(), chúng ta sẽ chỉ trả về 10 dòng từ CSDL – bắt đầu từ dòng 200.
C#:
VB:
Tổng kết
LINQ to SQL cung cấp một cách hay, rõ ràng để mô hình hóa lớp dữ liệu trong ứng dụng của bạn. Một khi đã định nghĩa mô hinh dữ liệu, bạn có thể dễ dàng thực hiện các câu truy vấn cũng như cập nhật, xóa, sửa dữ liệu một cách hiệu quả.
Hi vọng những hướng dẫn và ví dụ mẫu ở trên đã giúp bạn làm quen với LINQ. Tôi sẽ tiếp tục các bài viết này để giúp bạn khám phá LINQ to SQL một cách chi tiết hơn.
Các bạn đang xem bài viết trong loạt bài “LINQ to SQL”, loạt bài này được dịch từ blog ScottGu http://weblogs.asp.net/scottgu/
224 thoughts on “Sử dụng LINQ to SQL (LINQ to SQL phần 1)”
When insert new record in C#, I can not use like your introduction🙂.
But I can use by this way
db.Categories.InsertOnSubmit(category);
Btw, thanks🙂
there are two ways to insert a new record, the first way is you have to call InsertOnSubmit function as you did. The second way is you can simply add the new record to a collection of objects.
I don’t know why you can not do it, but I can insert in both of these ways😀
Thanks bạn Nam Già nhiều lắm.Bạn đã làm 1 việc rất có ý nghĩa cho mọi người.
Mình thấy BLog ScottGu rất hay.và những bài dịch của bạn cũng rất bổ ích.
Chúc bạn sức khỏe!
He he, thanks
Bạn viết rất hay và kỹ.Nhưng thực ra các bạn có thể vào đây để xem các đoạn video và source code:
http://asp.net
Nhưng mình không hiểu
vd:
NorthwindDataContent db =new NorthwindDataContent();
var products=from p in db.products
select p;
vậy mình muốn đưa từng giá trị của p vào các ô textbox thì mình phải làm như thế nào?
Vì kết quả trả về của câu truy vấn chứa trong biến products là một tập hợp, vậy nên nếu bạn muốn đưa vào các ô text box thì bạn phải chỉ ra dòng nào trong tập kết quả này.
var products=from p in db.products select p;
txtProductID.Text = products.ElementAt(i).ProductID;
Hoặc nếu kết quả của bạn chắc chắn là một dòng thì bạn có thể dùng phương thức mở rộng Single() để lấy về dòng duy nhất đó.
var product=(from p in db.products select p).Single();
và sau đó viết txtProductID.Text = product.ProductID;
Nam cho mình hỏi cái nữa, mình gặp phải vấn đề khi update. Nó cứ hiện ra thông báo là:
Cannot add an entity with a key that is already in use.
Trên mạng, nó có chỉ là phải set null cái DataContext, rồi tạo cái DataContext mới và dùng lệnh:
newDc.[Entitys].Attach(newEntity, true);
nhưng mình vẫn không làm được.
Không biết Nam và mọi người gặp phải trường hợp này chưa?
Thông báo trên có thể do bạn đã thêm một bản ghi với khóa đã tồn tại, trường hợp này chỉ có duy nhất một cách là bạn phải thay giá trị khóa khác để không bị trùng.
Thêm nữa, nếu muốn tạo một đối tượng DataContext mới thì bạn chỉ cần new lại mà không cần đặt null trước, nhưng thực ra việc này có lẽ không giúp ích gì trong trường hợp này.
Cái này là mình làm trong phần update. Xóa cái record rồi insert lại cái đó đã được chỉnh sửa thì ok. Còn update bình thường như đoạn code trên thì nó thông báo lỗi như vậy.
Bạn có thể gửi đoạn code đó lên đây được không ?
Cac ban oi minh la thanh vien moi. Minh moi bat dau tim hieu ve Linq to SQL. Minh thay luc goi doi tuong DataContext nhan vao 1 gia tri la String. Nhung minh chua hieu String nay duoc dung nhu the nao? No co phai la duong dan de luu file database khong? Lam sao de goi no? Giup minh voi. Thankyou
String đó chính là chuỗi “connection string” dùng để kết nối đến CSDL. Bạn có thể tham khảo chuỗi kết nối này trong các sách về ADO.NET để biết cách dùng chuỗi này.
Riêng đối với LINQ to SQL bạn có thể dùng cú pháp sau: Server=;Database=;UserID=;Password=;Trusted_Connection=false;
Trong đó:
là tên máy chủ
là tên CSDL
là người dùng
là mật khẩu
(Chú ý là LINQ to SQL chỉ được dùng với SQL Server)
Bạn Nam ơi, cho mình hỏi tí nhé:
Mình có 1 table là tblUser(username,password)
Mình có 1 form gồm 2textbox là: txtusername và txtpassword. và thêm 1 button đăng nhập.Muốn kiểm tra dữ liệu người dùng nhập vào có đúng với 2 trường đó trong table hay ko thì phải viết đầy đủ như thế nào hả bạn?Mình mới học nên chưa nắm rõ lắm. Nhớ bạn chỉ giúp nha. Thanks….
Bạn có thể viết là:
var c = (from user in context.tblUser where user.username = txtusername.Text and user.password = txtpassword.Text).Count();
Nếu (c == 1) có nghĩa là có 1 cặp username/password khớp với thông tin đã nhập.
Cám ơn những bài dịch bổ ích và những câu trả lời nhiệt tình của anh Nam, chúc anh sức khỏe để còn tiếp tục giúp mọi người nha.
a Nam cho hỏi :
trong câu lệnh : “2.Cập nhật một sản phẩm trong CSDL” nếu mà có 2 sản phẩm cùng tên thì sữa lại như thế nào?
Nếu vậy thì em phải lấy Product thông qua ID, kiểu như sau:
Product product = db.Products.Single(p => p.ProductId == txtProductId.Text);
Rồi sau đó đổi tên như bình thường
Em chưa hiểu đoạn này:
Product product = db.Products.Single(p => p.ProductId == txtProductId.Text);
Cái p ở đây là gì, có phải khai báo hay không, và nó có tác dụng gì trong đoạn code này ạ.
Đây là một biểu thức lambda, viết như vậy có nghĩa mình đang khai báo một hàm anonymous có dạng:
bool f(p)
{
return p.ProductId == txtProductId.Text;
}
Biểu thức lambda rất hay được dùng với LINQ, vì nó giúp code gọn gàng hơn, thay vì phải khai báo một hàm, rồi truyền delegate đến hàm đó vào cho câu lệnh Single, ta có thể viết trực tiếp kiểu như trên luôn.
dùng Linq với Linq to sql có gì khác nhau.Mình mới tìm hiểu,mong các bạn giúp đỡ
anh Nam ơi!cho em hỏi mình dùng StoreProceduce trong Linq như thế nào?Tại sao em không thấy cái Sto nào trong khung explore server?Mong anh giúp em sớm
LINQ là một thành phần trong .NET cho phép bạn có thể viết các câu lệnh theo kiểu truy vấn ngay trong mã nguồn C#, VB (hay các ngôn ngữ được hỗ trợ trên .NET khác), các câu lệnh truy vấn này cho phép bạn làm việc dễ dàng với các tập hợp dữ liệu như array, list… hoặc cả các cấu trúc phức tạp hơn như XML và dữ liệu quan hệ trong 1 cơ sở dữ liệu.
LINQ được cấu thành từ nhiều thành phần, và kiến trúc mở của nó cho phép nhà phát triển có thể xây dựng các thành phần mới dùng LINQ để truy vấn vào các nguồn dữ liệu khác. Mỗi một kiểu thành phần truy cập nguồn dữ liệu sẽ được đặt 1 cái tên như LINQ to Objects, LINQ to XML hay LINQ to SQL (chuyên dùng để truy cập vào dữ liệu trong CSDL SQL Server).
Nếu trong khung Server Explorer không có Stored Proc thì có nghĩa là em chưa có cái nào, em phải tạo mới trước khi dùng.
mình phải tạo nó như thế nào hả anh Nam. Em mới tìm hiểu nên cũng không rõ lắm, anh giúp em với nhé.Cảm ơn anh nhièu
làm cách nào để gọi được lệnh northwind.SubmitChanges();trong linq to sql
bạn nào biết giúp mình với!
Bạn phải tạo một biến DataContext có tên northwind, trong các ví dụ ở bài trên thì biến này được đặt tên là db. Bạn chắc chắn đã phải có biến này rồi vì bạn bắt buộc thông qua nó để thực hiện truy vấn/cập nhật dữ liệu (nếu chưa thì gọi SubmitChanges để làm gì🙂 )
a cho em hỏi là tại sao khi duyệt qua tất cả các phần tử của một DataContext và lấy ra text của từng element (x.ElementAt(i).Text) khi chạy ctr lại báo là không support cái ElementAt??? Khi insert em cũng làm đúng như anh làm và ko có lỗi j xảy ra cả nhưng dữ liệu vẫn “trơ trơ” ko chịu vào csdl là sao anh nhỉ?
– DataContext không phải một tập hợp thì làm sao em có thể duyệt qua từng phần tử được ?
– Sau khi gọi InsertOnSubmit, nếu muốn dữ liệu được đưa thực sự vào CSDL thì em phải gọi SubmitChanges() trong lớp DataContext.
Anh Nam cho em hỏi giả sử em viết một câu truy vấn linq đơn giản trong tầng DataAccess chẳng hạn như:
DataClasses1DataContext db = new DataClasses1DataContext();
var p = from a in db.nviens
select a;
thì em phải trả về kiểu dữ liệu là gì để bên tầng giao diện em có thể gán nó vào một control ví dụ như dataGridView. Cám ơn anh nhiều.
Ban co the convert ket qua tra ve thanh` 1 arrayList cac nvien roi dua vao datagridview
Hi a.Nam, cho tôi hỏi: khi mình tạo 1 Datacontext, Khi mà trong database minh co thay đổi, vd như tên column, tên table, hoặc liên kết table, thi minh phải tạo lai DataContext, và phải sửa lại tất cả code LINQ? làm như vậy nếu đã code n` rồi thì sửa rất là phức tạp. có cách nào khác ko ?
Anh Nam cho em hỏi chút.
Em đang thử dùng LINQ. Nhưng khi em lấy một dòng trong một tập hợp như sau:
MessageBox.Show(products.ElementAt(0).ProductName);
thì chương trình lại báo lỗi là “Query operator ‘ElementAt’ is not supported'”
Em chuyển nó thành
products.toList().ElementAt(0).ProductName
thì lại được.
@văn đạo: Cảm ơn bạn Son đã trả lời giúp, ngoài ra nếu anh nhớ không lầm thì nhiều control cũng hỗ trợ các LINQ data table hoặc query, do vậy em có thể gán luôn biến p vào cho DataSource cũng được.
@Son: tất nhiên rồi bạn ạ, tuy nhiên dùng LINQ to SQL có lợi ở chỗ khi tạo lại data model xong, trình dịch sẽ phát hiện được ngay các câu truy vấn nào cần phải sưa lại cho bạn.
@pvt: Vì products của em thực chất là một câu query, do vậy nó không hỗ trợ ElementAt (cũng như em không thể dùng elementAt trên một tập kết quả SELECT vậy).
Em có một câu hỏi nhỏ là tại sao biến “var” em đánh trong class thì không hiểu mà trong win form lại hiểu. Cám ơn anh
var là từ khóa được dùng để khai báo một biến có kiểu do trình dịch tự xác định, và chỉ được dùng khi khai báo các biến local, tức là bên trong các phương thức – và không phụ thuộc phương thức đó thuộc một lớp winform hay một lớp bình thường khác.
Khi thiết kế DBML, nếu có 2 class có ràng buộc với nhau (Product và Category chẳng hạn), thì tại WCFService khi muốn lấy toàn bộ dữ liệu của Product (trả ra kiểu list) không được.
VD:
public List GetAllProduct()
{
NorthwindDataContext db = new NorthwindDataContext ();
var product = from p in db.Products
select p;
return product.ToList();
}
Nhưng nếu 2 class đó là Product và Customer (không có ràng buộc) thì lại lấy được? Vậy là sao, mong các cao thủ chỉ giáo.
Chào bạn, nguyên nhân gây ra lỗi trên là do việc nạp dữ liệu xoay vòng. Khi gọi ToList(), các Product sẽ load các Category tương ứng, rồi các Category lại nạp tiếp các Product tương ứng, điều này sẽ gây lỗi và service sẽ đóng kết nối.
Để giải quyết vấn đề này, bạn phải chỉnh lại thuộc tính Serialization Mode của mô hình dữ liệu thành Unidirectional (mặc nhiên là None). Chế độ Serialization này chỉ thực hiện việc “serializing” từ lớp cha sang lớp con mà không làm ngược lại (*). Ngoài ra, bạn cũng phải yêu cầu LINQ to SQL nạp các đối tượng con khi thực hiện truy vấn:
NorthwindDataContext context = new NorthwindDataContext();
System.Data.Linq.DataLoadOptions dlo = new System.Data.Linq.DataLoadOptions();
dlo.LoadWith(e => e.Product);
context.LoadOptions = dlo;
var category = from c in db.Categories
select c;
return category.ToList();
(*) Vì tính chất này nên bạn phải lấy Category và con của nó (Product) thay vì lấy các Product như bạn làm.
Bạn có thể tham khảo thêm về vấn đề này tại đây: http://www.codeexperiment.com/post/Returning-LINQ-to-SQL-Entities-From-WCF.aspx
Cám ơn NamDH!
Mình thử chuyển thuộc tính Serialization Mode = Unidirectional thì được luôn, mà không phải viết lại LINQ.
Từ trước tới giờ mình quen thao tác với dữ liệu thông qua DataSet, giờ Silverlight không đọc được DataSet trả về từ WCFService, nên cũng hơi khó khăn, phải bắt đầu với LINQ.
Cậu có tài liệu hướng dẫn bắt đầu với LINQ không, ý nghĩa của các câu lệnh ấy. Đơn giản như câu lệnh này e => e.Product mình cũng chưa hiểu.:D
Quen với SQL Query rồi.
Mình có muốn hỏi mấy vấn đề nữa😀
– Giả sử mình muốn trả ra List chỉ gồm có ProductID, ProductName, CategoryName thì mình phải viết thế nào? Lúc mình trả ra toàn bộ (như kiểu SELECT *) thì được, nhưng khi select new {p.ProductName}, rồi return product.ToList() thì báo lỗi.
– Khi có List như vậy rồi, mình muốn Bind một Column cụ thể vào TextBox như thế nào.
Như DataSet ngày xưa thì là:
TextBox1.Text = DataSetName.Tables[0].Rows[0][“COLUMN_NAME”].ToString();
Bạn có thể tham khảo sách LINQ tại đây: https://namdh.wordpress.com/2008/07/28/linq-book/
Còn câu e => e.Products ở trên thì nó tương tự như việc khai báo một hàm có dạng:
function f(e)
{
return e.Product;
}
Đây là một biểu thức lambda được giới thiệu cùng LINQ, và cũng là một phần “gần như” không thể thiếu khi dùng LINQ (vì vẫn có thể không dùng như sẽ mất công hơn nhiều).
Bạn nói rõ lỗi gặp khi gọi toList() được không ?
http://yfrog.com/3x24156181j
Ý mình là muốn join 2 bảng Product và Category để lấy Tên sản phẩm, Tên Nhóm sản phẩm chẳng hạn
Bạn có thể giúp mình viết phần đó được không? Và cả cách đưa dữ liệu ra 1 Control nữa
Kiểu như thế này:
– Khi có List như vậy rồi, mình muốn Bind một Column cụ thể vào TextBox như thế nào.
Như DataSet ngày xưa thì là:
TextBox1.Text = DataSetName.Tables[0].Rows[0][“COLUMN_NAME”].ToString();
public List GetAllCategories()
{
TAIKHOANDataContext db = new TAIKHOANDataContext();
var product = from p in db.Products
select new
{
p.Category.CategoryName,
p.ProductName
};
return product.ToList();
}
Error:
1) Error 1 Instance argument: cannot convert from ‘System.Linq.IQueryable’ to ‘System.Collections.Generic.IEnumerable’ D:\ASPNet\SilverLight_Login\MyWebService\TAI_KHOAN_SERVICE.svc.cs 54 20 MyWebService
2) Error 2 ‘System.Linq.IQueryable’ does not contain a definition for ‘ToList’ and the best extension method overload ‘System.Linq.Enumerable.ToList(System.Collections.Generic.IEnumerable)’ has some invalid arguments D:\ASPNet\SilverLight_Login\MyWebService\TAI_KHOAN_SERVICE.svc.cs 54 20 MyWebService
Alo, đồng chí NamDH đâu rồi, support cho mình mấy câu hỏi này đi, nghiên cứu mãi mà không ra.
Vì không có chương trình của bạn nên mình khó biết chính xác lỗi gì, nhưng theo thông báo thì có thể nó không thể dùng ToList cho một lớp anonymous (được tạo bởi câu select new
{
p.Category.CategoryName,
p.ProductName
};)
Bạn hãy thử dùng một lớp cụ thể xem sao, ví dụ, bạn có thể tạo một lớp như sau:
class ProductInfo {
public ProductInfo(string pn, string cn) {
this.ProductName = pn;
this.CategoryName = cn;
}
public ProductName()
{ get; set; }
public CategoryName()
{ get; set; }
}
Câu truy vấn sẽ được viết lại như sau:
var product = from p in db.Products
select new ProductInfo
{
p.ProductName,
p.Category.CategoryName
};
Kiểu trả về của hàm sẽ là:
public List<ProductInfo> GetAllCategories()
Bạn thử lại xem, nếu vẫn còn lỗi thì tốt nhất bạn gửi cả project lại đây🙂
Bạn gán giá trị vào TextBox như sau:
TextBox1.Text = myQuery.ElementAt(0).ProductName;
Code của mình đây: http://www.mediafire.com/download.php?ymmwxnz5dqm
Bạn xem lại code giúp mình với nhé. Chạy bắt đầu từ trang Default.aspx, không cần phải gõ Username và Password. Database là Northwind.
Mình không gán trực tiếp giá trị vào TextBox ngay trong hàm đó, nên không thể lấy myQuery được.
Ở ví dụ của mình, tại trang DanhSachKhachHang.xaml, mình có 1 TextBox chẳng hạn, sau khi mình lấy được 1 List Product, mình muốn bind tên product đó vào textbox thì làm thế nào.
Cám ơn bạn rất nhiều!
Ví dụ như mình có 2 bảng HocSinh(MaHS,HoTen,MaLop) và Lop(MaLop,TenLop)
Mình truy vấn như sau:
from hs in context.HocSinhs
from l in context.Lops
where hs.MaLop == l.MaLop
select new
{
hs.MaHS,hs.HoTen,hs.DiaChi,l.TenLop
}
Khi show lên DataGridView thì dữ liệu trong Grid ở dạng readonly. Cho mình hỏi làm cách nào để modify dữ liệu trên Grid vừa show ra ?
Bác chủ Topic đang đi nghỉ mát😀
Alo, bác chủ topic đâu rồi, help me.
Thế này thì chạy OK
public List GetAllCategories()
{
TAIKHOANDataContext db = new TAIKHOANDataContext();
var product = from p in db.Products
select p;
return product.ToList();
}
Thế này thì báo lỗi:
public List GetAllCategories()
{
TAIKHOANDataContext db = new TAIKHOANDataContext();
var product = from p in db.Products
select p.ProductName;
return product.ToList();
}
Quên, hàm trả ra kiểu List nhé!
[code]
Trả ra kiểu List
[code]
Chà, mấy ngày này bận quá nên không trả lời “hộp thư truyền hình” được, sorry các bạn.
Ban ngày làm việc ở công ty, rồi lại đón con, chăm con (2 vợ chồng phải chăm 2 nhóc), chuẩn bị ra mắt phiên bản kế tiếp của StockViewer, hoàn thành những bước cuối cùng về kỹ thuật của 1 webgame, chuẩn bị các thủ tục để mở công ty, thử nghiệm các tính năng của Android và Silverlight mới, tập tành viết ứng dụng cho N97…
Giải quyết các nhiệm vụ trong Rainbow Six, xong rồi chuyển sang Call ỏ Duty 4 (đã xử lý xong thằng 5 rồi)😀.
Thầy mở công ty ạ. Công ty về lĩnh vực gì ạ. Chắc là cung cấp webgame. :)) E đoán thế. Bận thế lại còn call of duty. Thầy chia time kiểu gì mà tài quá. Thật là ngưỡng mộ. Chia sẻ cho em với.
Trời, mới post xong đã có reply rồi, nhanh quá. Thật là ngưỡng mộ.
Thực ra thì dù thời gian có eo hẹp đến đâu thì cũng cần phải để lại chút ít để relax, đó là lúc tái tạo sức lại động mà, có thể nghỉ ngơi, nghe nhạc, hoặc làm điều gì mình thích (chơi game :D). Nghỉ ngơi cũng là cách làm việc hiệu quả mà.
Có việc muốn hỏi tiếp ông bạn đấy😀 Chờ nhé!
Hix, sợ quá😀
Anh Nam ơi, em bây giờ muốn tìm hiểu về LinQ vậy anh có thể cho em một ví dụ đơn giản trên winform có sử dụng LInQ được ko? Em đang rất cần. Em cảm ơn anh nhiều.
Em mong sớm nhận được phản hồi của anh!
Cả nhà mình có ai tìm hiểu trên Winform rồi thì chỉ giáo giúp mình nhé. Cảm ơn mọi người nhiều1
LINQ thì dù có dùng trên ASP.NET hay dùng trong Windows Form thì cũng như nhau thôi em ạ.
Nếu em đã từng dùng ADO.NET rồi thì cứ thế mà áp dụng vào cho LINQ thôi🙂
DataClasses1DataContext bdd = new DataClasses1DataContext();
IEnumerable acc = bdd.pro_login(txt_User.Text, txt_Pass.Text);
//var acc = bdd.pro_login(txt_User.Text,txt_Pass.Text )
if (acc.Count()!=0)
{
foreach (account item in acc)
{
if (item.isadmin.Value==true)
{
Response.Redirect(“insert.aspx”);
}
else
{
Response.Redirect(“welcome.aspx”);
}
}
}
else
{
lbl_ThongBao.Text = “Tài khoản hoặc mật khẩu không đúng!!!”;
txt_User.Focus();
}
em viet nhu the nhung no lai bao loi, yeu cau cua e la , neu la thanh vien dang nhap thi cho vao trang welcome, neu thanh vien la admin thi cho vao trang insert, con neu sai tai khoan,thi xuat hien thong bao, nhung e viet nhu the, no lai bao loi la “The query results cannot be enumerated more than once. ” khi e nhap thong tin ve tai khoan dung.
bo sung chut, pro_login la store nhe, isadmin la 1 cot trong bang csdl kieu bit(true/false)
em không thể enum một query 2 lần (1 lần trong count). với đoạn code trên thì em có thể viết:
bool found = false;
foreach (account item in acc)
{
if (item.isadmin.Value)
{
Response.Redirect(”insert.aspx”);
}
else
{
Response.Redirect(”welcome.aspx”);
}
found = true;
}
if (!found)
{
lbl_ThongBao.Text = “Tài khoản hoặc mật khẩu không đúng!!!”;
txt_User.Focus();
}
nhưng nếu dùng SP thì cách trả kết quả như vậy có vẻ không hiệu quả, em nên kiểm tra ngay bên trong thủ tục và sau đó trả về mã kết quả (0 = not found, 1 = normal user, 2 = admin…) thì hay hơn.
SP của em giống vầy
“ALTER PROCEDURE pro_login
@user varchar(20),
@pass varchar(10)
AS
select * from accounts
where username=@user and pass=@pass
return @user,@pass”
giờ sửa như thế nào cho giống ý anh, hi, em ngốc lắm, phiền a chút nha
em viết giống như sau:
ALTER PROCEDURE pro_login
@user varchar(20),
@pass varchar(10)
AS
DECLARE @isadmin BIT
select @isadmin = isadmin from accounts
where username=@user and pass=@pass
IF @isadmin IS NULL
RETURN 0
ELSE
IF @isadmin = 0
RETURN 1
ELSE
RETURN 2
GO
Anh viết chay thôi, em về test và sửa lại cho chạy nhé.
Nhưng các anh chị ơi cho em hỏi là:những câu truy vấn trên chúng ta viết vào đâu vậy ạh.ví dụ như em muốn hiển thị dữ liệu len một listbox thì phải viết các câu truy vấn trên vào chỗ nào.
Chỉ dùm em với.
Cho mình hỏi tí nhé:
Mình có 1 table là login(userid,pass,role)
Mình có 1 form gồm 3textbox là: txtTK, txtMK,txtrole và 1 datagridview
Mình muốn là khi click vào bất kì 1 cell trong DataGridView thì sẽ xuất hiện userid lên txtTK
Giúp mình nha.ty
Hi anh,
Lâu quá không gặp, hi vọng anh vẫn “phong độ” như ngày nào.
Có một vài câu hỏi định send private cho anh, nhưng mà ko tìm được email. Đành spam ở đây vậy🙂
1. Em định trích dẫn bài viết của anh ở trang web riêng, vậy hi vọng anh cho phép, đó cũng là một cách để chia sẻ cho mọi người phải không anh ?
2. Em đang định viết bài về LinQ trong mô hình 3 lớp … Nếu anh đã có kinh nghiệm thì hi vọng anh góp ý cho em tham khảo.
Cảm ơn anh🙂
He he, dạo này bận quá nên hết “phong độ” rồi🙂
1. Em có thể trích dẫn các bài viết trên blog của anh. Tất cả các bài viết trên blog của anh đều có thể đăng lại mà không cần hỏi ý kiến anh, thậm chí có thể không cần đăng tên tác giả, tuy nhiên nếu đã đăng tên thì hi vọng đó sẽ là tên anh :)).
2. Ok, việc đầu tiên phải là viết các đã, rồi anh mới góp ý được.
LINQ and SQL, công nghệ mới này là mình không cần phải viết các thủ tục trong store procedure của sql nữa phải không Anh. Mình chỉ việc sử dụng công nghệ này là ok rồi phải không.
Vì hông hiểu nên hỏi, mong anh chỉ cho
Không em ạ, LINQ to SQL cho phép truy cập SQL Server chứ không phải để thay thế các đối tượng CSDL. Em vẫn phaari viết SQL Procs như bình thường.
Em muốn nhập thông tin tim kiếm dữ liệu, nếu trong SQL em dùng
where ten like %’abc’%
vậy với LinQ thì cách dùng như thế nào? Anh Nam chỉ giùm em với !
Chúc công việc của anh thuận lợi nhé !
Ặc, chào người hâm mộ.
Em có thể dùng câu lệnh Like như trong SQL, ? thay cho 1 ký tự bất kỳ, * thay cho một chuỗi ký tự bất kỳ (tương tự dấu % trong SQL).
Cảm ơn em vì lời chúc
Cám ơn anh Nam nhé.
Em cũng mới tìm hiểu được. Thay vì dùng toán tử LIKE trong SQL thì mình có thể dùng ‘Contains’ để thực hiện việc tìm kiếm tương đối.
VD để thực hiện tìm kiếm sinh viên theo Ho_Ten từ bảng SinhVien ta làm như sau :
using(DataClasses1DataContext _db=new DataClasses1DataContext())
{
var _ab= from p in _db.SinhVien
where p.Ho_Ten.Contains(“abc”) ;
select new {p.Ho_ten,p.ID}
}
Ngoài phương pháp này các bạn còn có thể dùng phương pháp khác.
Thay vì dùng LIKE và sử dụng dấu “%” như ‘%chuỗi_so_sánh%’ trong SQL, chúng ta có thể thay thế EndsWith và StartsWith cho dấu % bên phải hay trái.
ví dụ :
using(DataClasses1DataContext _db=new DataClasses1DataContext())
{
var _ab= from p in _db.SinhVien
where p.Ho_Ten.EndsWith (“abc”) ;
select new {p.Ho_ten,p.ID}
}
và …..
using(DataClasses1DataContext _db=new DataClasses1DataContext())
{
var _ab= from p in _db.SinhVien
where p.Ho_Ten.StartsWith (“abc”) ;
select new {p.Ho_ten,p.ID}
}
Đúng vậy, tùy sở thích em dùng cách nào cũng được vì nó sẽ cho kết quả tương đương. Bản thân Like, Contains, Startswith… cũng sẽ đều được dịch thành mệnh đề LIKE của SQL.
Cái report của devexpress được thiết kế như thế nào anh nhỉ? các bước xây dựng report í.
em xem video hướng dẫn nhưng mà không hiểu mấy. anh chỉ giùm em vài chiêu nha’.
Em đã tham chiếu tới thư viện SQLConnection và SQLDataAdapter. Tạo kết nối tới database
nhưng sau khi em chọn tên server và database chuyển qua bước chọn table và field thì không được, nó không hiển thị các table và field cho mình chọn.
Nguyên nhân tại sao vậy anh Nam !
Ờ ờ, anh chưa dùng cái report của nó bao giờ nên cũng không biết (gãi gãi đầu :”> )
Mình cũng đang nghiên cứu LINQ, mình đang dùng nó làm DAL ! cái luân chuyển giữa các tầng là entity ! nhưng mình ko hỉu 1 hàm trong DAL khi xay dựng bằng LINQ như thế nào ? mình không biết làm sao chuyển từ kết quả trả về của biểu thức Lambda(1 collection) sang entỉy cả !
public Phanphoi goisv()
{
DALDataContext sp = new DALDataContext();
Phanphoi pp = new Phanphoi();
tim = from p in sp.Phanphois select new {p.Manhapp,p.Tennhapp};
return tim;
}
Để dễ dàng, bạn có thể sửa lại hàm như sau:
var pp = from p in sp.Phanphois select new Phanphoi(){manhapp:=p.Manhapp,tennhapp := p.Tennhapp};
if (pp.Count() == 1)
return pp.Single();
else
return null;
Ai co sach ve Linq to SQL share cho minh tham khao voi.
Ở đây bạn ơi: https://namdh.wordpress.com/2008/12/04/linq-book/
Một ngày đẹp trời em bị lỗi này:”String or binary data would be truncated.
The statement has been terminated” khi thêm Product với Category khi gõ ví dụ trên của anh. Em không hiểu vì sao nó lại ngăn ko cho dùng string với binary. Anh Nam hel…..p em😦
Lỗi này xuất hiện khi em đưa giá trị vào 1 cột mà chiều dài chuỗi lại lớn hơn độ rộng của cột khai báo trong CSDL, em kiểm tra lại nhé.
Mấy huynh ơi giúp đệ với. Đệ bị lỗi này nè. Không connect được
Thanks
wow pro :)) thanks anh
@xmen: Có vẻ như em đang dùng VS 2008 để truy xuất vào SQL 2005. Nếu đúng như vậy thì em vào link sau: http://www.microsoft.com/downloads/details.aspx?FamilyId=C6C3E9EF-BA29-4A43-8D69-A2BED18FE73C&displaylang=en#filelist
Sau đó tải về và cài đặt các thành phần sau đây:
* Microsoft SQL Server System CLR Types
* Microsoft SQL Server 2008 Management Objects
* Microsoft SQL Server 2008 Native Client
Chúc may mắn
Thanks a Nam. Em update thằng VS2008 lên SP1 là OK rồi. Có j thắc mắc cho e hỏi tiếp nha.
anh oi cho em hoi xem tai lieu hoc LINQ TO SQL duoc khong ha anh!!!
Khi update, mình muốn kiểm tra field nào được thay đổi bằng property GetChangeSet() của dataContext để ghi lại log có dc kg? hay phải dùng cách thường là check từng field một?
Thanks
Anh nam ơi anh có thế nói giúp em ý nghĩa của các từ khóa trong linq to sql được không.
ví dụ :var,single…
em chỉ hiểu lôm na từ khóa var kiểu như trả về 1 tập các đối tượng thì phải,còn từ khóa single không hiểu ý nghĩa của nó em chỉ biết khi xóa và cập nhật sau khi sửa 1 bản ghi thôi.
mong anh chỉ giùm em ạ!
@nhanbh: Được, nhưng không rõ bạn muốn log thế nào
@vu hoang: Chà nếu chỉ hết thì sẽ rất nhiều, vụ này chỉ có thể giải quyết được bằng cách đọc MSDN thôi, cố lên em, vừa nâng cao kiến thức vừa củng cố vốn tiếng Anh chuyên ngành.
@nguyen quoc tuan: Đây nhé em https://namdh.wordpress.com/2008/12/04/linq-book/
Product product = db.Products.Single(p => p.ProductId == txtProductId.Text);
Anh ơi anh giải thích câu lệnh này giúp em với ah em chưa hiểu lắm và nếu em ko dùng Single mà dùng SingleandDefault thì có khác nhau như thế nào ah ?????
public List GetOneCategories(int ID)
{
DataClassesDataContext db = new DataClassesDataContext();
/*
*
*/
var cate = from c in db.Categories
where c.CategoryID == ID
select new Category
{
Description = c.Description,
CategoryName = c.CategoryName
};
var myList = cate.ToList();
return myList;
}
Sao mình viết như thế này lúc search theo ID lại không được nhỉ? Giúp với. Ý mình là muốn select 1 số column thôi, rồi chuyển về List để hiển thị trong Grid của Silverlight ấy mà.
Alô, sao không có ai giúp mình vậy?
@Hoa Nhật Quỳnh: Product product = db.Products.Single(p => p.ProductId == txtProductId.Text);
p => p.ProductId == txtProductId.Text là một biểu thức Lambda, em đọc thêm bài sau để tìm hiểu nhé: https://namdh.wordpress.com/2009/07/22/lambda-expression/
Còn Single và SingleOrDefault dùng để trả về một dòng duy nhất, nếu tập kết quả có nhiều hơn 1 dòng thì sẽ throw InvalidOperationException.
Sự khác nhau là trong trường hợp tập kết quả rỗng thì Single sẽ throw InvalidOperationException, còn SingleOrDefault sẽ trả về một đối tượng có giá trị mặc nhiên (0 nếu là số, null nếu là kiểu reference type… – tương tự như giá trị trả về của từ khóa default trong C#)
@Scorpion: không rõ lỗi em nói tới là lỗi gì😦
Trong trường hợp này có thể có vấn đề xảy ra nếu Category là một lớp entity tạo ra bởi LINQ, trường hợp này em phải tạo một class mới để chứa kết quả trả về hoặc đơn giản là dùng lớp anonymous:
…
where c.CategoryID == ID
select new
{
c.Description, c.CategoryName
};
Còn nếu không phải lỗi này thì em phải post thêm lỗi mới biết được.
public List GetOneCategories(int ID)
{
DataClassesDataContext db = new DataClassesDataContext();
/*
*
*/
var query = (from c in db.Categories
where c.CategoryID == ID
select c).first();
return new Category
{
Description = query.Description,
CategoryName = query.CategoryName
};
thầy Nam cho em hỏi là em có 1 câu query là “select distinct left(productname) from product” thì phải làm sao
Anh không rõ yêu cầu của em lắm nhưng anh đoán em muốn 1 câu query giống thế này:
var productNames = (from p in dataContext.Products select p.Name.SubString(0, 5)).Distinct();
dạ ko, ý em là em muốn làm 1 cái list sản phẩm theo ký tự đầu của chúng. nên em muốn lấy ra các ký tự đầu của sản phảm và tương ứng với ký tự đầu đó sẽ là tên các sản phẩm có cùng ký tự đầu. vì dụ như: “select distinct left(productname,1) from product” nó sẽ trả ra 1 list các ký tự đầu tiên từ a-z nếu như chữ cái đầu tiên của sản phẩm có kí tự đó. thật tình thì nó giống như trang này http://www.nativeremedies.com/petalive/products.html. Em muốn select ra 1 list các kí tự đầu tiên của sản phẩm để làm tiêu đề và tương ứng với tiêu đề sẽ là các sản phẩm có chữ cái đầu tiên trùng với tiêu đề. xin anh giúp em
vậy thì cũng là câu lệnh trên, nhưng thay số 5 bằng số 1 để chỉ lấy về ký tự đầu thôi
vậy cho em hỏi nếu em muốn làm 1 câu lệnh như thế này “select * from product where productname = select distinct left(producname,1) from product thì câu lệnh trong linq la như thế nào
xin chào anh Nam và các bạn
Hiện e là người mới bắt đầu nghiên cứu silverlight, nhưng khi thao tác trên LINQ e không biết cách dùng store proceduce (insert, update, delete) thông qua WCF, , e chỉ dùng được mỗi cái sp duy nhất là Get(dùng câu truy vấn select mà thôi).Có thêm xóa sửa được xin chỉ em dùm
cách lấy sp của em làm dc sp lấy dữ liệu mà thôi:
public List getData()
{
var sql = db.GETDATA();
return sql.ToList();
}
chào em, nếu muốn truy cập dữ liệu từ Silverlight client, cách đơn giản mà hiệu quả nhất là dùng Ria Services. Em có thể học về nó qua loạt bài sau: https://namdh.wordpress.com/tag/ria-services/
@alonedragon: anh không hiểu câu SQL của em định làm gì cả😦
a` anh Nam ơi e hỏi cái, cái girdview lọc theo điều kiện của dropdownlist trong bài 5, bước 4 : Lọc danh sách sản phẩm . Nếu em muốn thêm 1 điều kiện All vào dropdownlist tức là hiện tất cả products thì phải làm sao? em đã thử thêm điều kiện All và xử lý sự kiện indexchanged riêng của dropdownlist nhưng khi gridview hiện ra tất cả thì nó ko còn chức năng auto sort, paging, update, delete nửa và khi chọn category khác trong dropdownlist thì nó ko còn hiệu lực nửa😀
tượng tự viết một hàm tìm kiếm dùng cái girdview đó luôn thì nó tìm ra nhưng chức năng sort paging update delete và lọc danh sách theo dropdownlist cũng mất luốn ^^!
@Loc: Em có thể post đoạn code của em lên không?
Theo anh đoán thì có thể do sự khác nhau giữa các câu truy vấn dẫn đến kiểu của tập kết quả khác nhau (IQueryable và IOrderedQueryable chẳng hạn)
Anh Nam cho em hỏi nếu mình tạo một dự án ứng dụng trên web thì cơ sở dữ liệu lưu ở đâu nếu chương trình này cho phép nhiều người sử dụng
Em đã đọc nó nhưng mà toàn tiếng anh với lại e cũng chưa hiểu, e muốn tạo một lớp csdl và gọi các service từ WCF lên, em suy nghĩ mà vẫn chưa tìm ra được. Mong anh giúp đỡ. thanks
Hầu hết các CSDL hiện nay đều hỗ trợ nhiều người dùng, ngay cả các CSDL dựa trên file như Access, SQlite, SQLCE… (tất nhiên các CSDL file based còn có nhiều hạn chế về mặt này).
Em có thể dùng SQL Server, Oracle hay Mysql và tạo kết nối đến nó, với các CSDL chuyên nghiệp này, việc sử dụng cho các website là hoàn toàn dễ dàng.
Em cũng đang sử dụng sql server nhưng là khi chuyển qua linq thì không còn làm theo cách ado.net được nữa, khi xưa em chỉ cần viết 1 lớp cơ sở để thực hiện việc thêm xóa sửa, sau đó mình chỉ cần truyền tên của Store vô là được nhưng với linq thì e chưa làm được điều trên.Ở wcf em viết các hàm insert , update, delete chuẩn sau đó em qua lớp .cs để gọi các hàm từ wcf service nhưng hiện tại e vẫn chưa biết cách làm, anh có thể giúp em được không
“nhưng với linq thì e chưa làm được điều trên” – anh nghĩ đã có LINQ to SQL thì em không cần làm điều trên nữa.
Còn về WCF thì em có thể tìm một số tài liệu về nó để học, các yêu cầu của em cũng khá đơn giản nên anh nghĩ em có thể làm được nhanh thôi.
Trong Linq khi ta kéo Table vào thì nó sẻ mô hình hóa table thành lớp. Trên thực tế em đang gặp một hệ thống gồm nhiều ứng dụng hợp lại, người ta thường gọi là ERP. Trong ERP thường ít nhất là 5 chức năng : Kế toán , Quản lý Kho, Quản lý Nhân Sự, Quản lý Bán Hàng, Quản lý Tài Chính,…..nếu tập hợp lại thì csdl có thể lên tới con số 1000 table, em có nên tạo nhiều linq to sql không anh Nam?
anh Namdh ơi!
Cảm ơn anh vì bài viết hay về LINQ.
Em hỏi anh một vấn đề:
Giả sử em có một trang đăng nhập.
Có 1 file .txt chứa DB về User và Pass
em muốn xây dựng đoạn code trên C# để đưa DB trên vào.
Anh giúp em với.Thank much!
@linhduy: Hoàn toàn được và nên làm như vậy
Có nghĩa là em copy user/password từ database vào file txt? Vậy thì chỉ đơn giản là làm một câu query từ database rồi write vào file thôi, quá đơn giản nhỉ?
@namdh: không anh hiểu sai ý em roài! ý em là ngược lại ý của anh.
Em mới học về cái này nên chưa biết nhiều lắm.
Vậy thì đọc file text rồi insert vào database thôi, cũng đơn giản không kém.
anh Nam cho em hỏi cách nào để so sánh dữ liệu nhập vào trước khi mình gọi store insert hay câu linq insert.
E dùng WCF thì nó bị lỗi. So sánh thì được nhưng mà khi insert chỉ được một lần, insert thêm 1 lần nữa là nó báo lỗi liền.
Code WCF Service
/////////////////////
public bool Diploma_Compare(string id)
{
var q = (from v in db.D_BangCaps
where v.BangCapID == id
select v).Count();
if(q > 0)
{
return true;
}
else
{
return false;
}
Anh Nam ơi cho em hỏi, mình viết một câu lệnh insert trong wcf service như thế nào vậy anh
LinQ quá hay!
Nhưng không biết anh Nam ơi, có chương trình nào, hay trang web nào chuyên chuyển đổi từ câu lệnh SQL sang dạng LinQ trong C# không nhỉ.
Thân chào, cảm ơn.
hiện tại em đang có 1 vấn đề với Linq này mong anh Nam giúp đỡ em với.
Giờ em có 1 đoạn code thế này:
int count = 0;
DataClassesDataContext dc = new DataClassesDataContext();
string sql = “select Count(*) from A where validtime-getdate()0”;
dc.Connection.Open(); using(dc.Transaction=dc.Connection.BeginTransaction())
{
count =dc.ExecuteCommand(sql);
dc.Transaction.Commit();
}
dc.Connection.Close();
Giờ em đếm số record trong DB ra ngoài biến count để show ra giao diện.
với câu lệnh trong sql thì nó show đúng rồi nhưng khi chạy qua Linq thì nó lại trả về -1.
Anh giúp em với. thanks anh nhiều
Oh, đoạn code này trong không giống LINQ tí nào.
Em có thể viết đơn giản là:
var c = (from a in dc.A where …).Count();
Thế là xong
Không đc đâu anh, vì nếu như viết theo dạng như anh nói thì trong Linq không cho phép so sánh ngày tháng trực tiếp như trong SQL. Ý em là muốn đem câu lệnh sql vào trong Linq luôn.
Em ví dụ thế này: giờ em có ngày 10/10/2010 là ngày hết hạn. Em cần so sánh nó với ngày hiện tại xem còn bao lâu nữa thì bị hết hạn cũng như sắp hết hạn để thông báo cho user cập nhật thông tin.
string sql = “select Count(*) from A where validtime-getdate()>0″;
count =dc.ExecuteCommand(sql);
Chào a. E thấy bài viết anh rất hay . E muốn copy bài anh sang http://geeksship.com/Site/Home/Index.aspx
Cám ơn anh nhiều nha!!!
@Dương Đăng Quốc : Không biết có đúng í anh không vì linq có thể sử dụng sp ,LinQ truyền vào giá trị có dạng System.Datetime rồi trong sp sẽ xử lí .
Cảm ơn anh namdh nhiều, các bài của anh rất bổ ích và dễ hiểu . Không biết trong web của anh có bài nào viết về biểu thức lambda không em thấy phía trên anh có sử dụng, em mong được anh chia sẻ 1 bài viết về lambda .
sr anh vì em chưa search đã đặt câu hỏi😦
https://namdh.wordpress.com/2009/07/22/lambda-expression/
xin chao moi nguoi!!!!
em hiện đang là sinh viên. nay em đang tìm hiểu một đề tài về linq và asp.net MVC. hiện em có 1file sql khi em tao file linq to sql sau do em connect file sql đó vào nhưng ko đc dữ liệu gi cả. mong mọi nguòi chi guip em voi! thanks!
cac anh oi cho e hoi chut! e co co so du lieu trong sql server 2005 e back up roi sau do e tao file linq to sql classes sau do e connection toi file back up do nhung no bao la file buck up ko ton tai.
mong cac anh giup e voi e dang can gap!
thanks
@Dương Đăng Quốc: nếu vậy em xem bài 8 nhé: https://namdh.wordpress.com/2009/08/03/excecuting-custom-exp-linq-to-sql-part-8/
@vansydlu: câu hỏi của em mơ hồ quá
y cua e la. e co 1 file back up cua sql server 2005. e co the tu linq to sql connection toi file do duoc ko?
va so the thi lam nhu the nao duoc ha a?
Anh cho em hỏi là quá trình đóng mở connection của LINQ này như thế nào nhỉ?
h= new QlBan_HangDataContext();
var nguyen = from g in h.Danh_Muc_San_Phams
where g.Ma_San_Pham==int.Parse(txtMa_San_Pham.Text)
select g;
* h.Danh_Muc_San_Phams.DeleteOnSubmit(nguyen);
h.SubmitChanges();
loi bao dong * nhu the nay:
Argument ‘1’: cannot convert from ‘System.Linq.IQueryable’ to ‘CSDL.Danh_Muc_San_Pham’
A giup e khac phuc loi voi. Chi e Convert. Thanks.
E dung QLBan_HangDataContext la classlibrary.
E build va using roi.
Em đổi DeleteOnSubmit thành DeleteAllOnSubmit hoặc dùng Single để lấy 1 sản phẩm duy nhất.
e chay duoc roi. a giai thich ro cho e duoc ko. khac nhau gi vay.
voi lai cai table nua. hi. ep kieu datatable cho var ko duoc ha a.
truoc gio e van ep bang sqlcommand;
khong biet co cach khac khong. hi.
thanks a nhieu
a cho e hoi them la cai table trong linq khac datatable trong C# nhu the nao. hi.
sao ko thay tra loi e vay. giup e voi.
a.Nam Giup minh voi
Mình tạo thử trang này http://lichsu.vn các bạn thử xem sao! Đừng chém nhé!
Bạn có thể đổ dữ liệu vào DataGridview
var student = from a in ketNoiDuLieuDataContext.Students
join b in ketNoiDuLieuDataContext.StudentsJoinClasses on a.StudentId equals b.StudentId
where a.ProvinceId == Id
select new { a.StudentId, a.FirstName, a.LastName, a.PermanentAddress, b.PaymentAmount };
dataGridView1.DataSource = student;
Ở trên là mình đổ dữ liệu là thông tin students vào GridView dựa vào những students có ProvinceId được chọn trên Combobox.
Lần đầu tiên,Có gì sai mong góp ý!
cho mình hỏi mình đang làm linQ với Visual studio bây giờ sau khi load thông tin của 1 thành viên qua 1 form khác nếu có lưu lại những chỉnh sửa thì ta phải làm như thế nào…cập nhat lại thông tin cho thành viên đó
Great Blog ^^
Happy New Year 2011
a nam oi! e dang gap vuong mac cho nay a giup e voi
.Gia su trong SQl 2005 e viet ham nhap khoa:
ALTER proc [dbo].[sp_Nhapkhoa]
@makhoa nchar(10),
@tenkhoa nvarchar(150),
@Sodienthoai nchar(10),
@trangthai bit
as
if (not exists(select makhoa from Tb_Khoa where makhoa=@makhoa))
begin
insert into Tb_Khoa(makhoa,tenkhoa,Sodienthoai,Trangthai) values(@makhoa,@tenkhoa,@Sodienthoai,@Trangthai)
end
else
begin
update Tb_Khoa set tenkhoa=@tenkhoa where makhoa=@makhoa
update Tb_Khoa set Sodienthoai=@Sodienthoai where makhoa=@makhoa
update Tb_Khoa set Trangthai=@Trangthai where makhoa=@makhoa
end
return
Tren C# ta viet ham goi lai:
public bool Nhap_khoa(string Makhoa, string Tenkhoa, string Sodienthoai,string Trangthai)
{
try
{
SqlParameter[] p =
{
new SqlParameter(“@Makhoa”,SqlDbType.NChar,10),
new SqlParameter(“@Tenkhoa”,SqlDbType.NVarChar,150),
new SqlParameter(“@Sodienthoai”,SqlDbType.NChar,10),
new SqlParameter(“@Trangthai”,SqlDbType.Bit)
};
p[0].Value = Makhoa;
p[1].Value = Tenkhoa;
p[2].Value = Sodienthoai;
p[3].Value= Trangthai;
int rowsAffected = ExecuteNonQuery(“SP_Nhapkhoa”, p);
return rowsAffected == 4;
}
catch
{
return false;
}
}
khi ta tao Winform:se co 3 textbox va 1 checkbox(trang thai).
button nhap co code nhu sau:
private void button1_Click(object sender, EventArgs e)
{
if (dulieu.Nhap_khoa(txtma.Text, txtten.Text, txtsdt.ToString(),checkBox1.Checked.ToString()) == true)
MessageBox.Show(“Nhap thanh cong”);
}
nhung chay chuong trinh ko dc a oi.e biet la no loi kieu du lieu so dien thoai(nchar)va trang thai(bit)nhung e ko the khac phuc dc.a co the giup e dc ko?.Thanhk anh nhiu nhiu!!
Chào a Nam!cho e hỏi vấn đề này nhé,trên form order của e,e muon tính và hiển thị cột tổng tiền trên datagirlview,nhung e ko bt làm cách nào a Nam có thể giúp em nhé!Cám ơn a nhiều.
Các bạn ơi, các bạn chịu khó tìm giải pháp nhé, tôi chỉ có thể trả lời các câu hỏi liên quan trực tiếp đến nội dung bài viết🙂
Thanks
Em chào Anh Nam.
Em có một vấn đề mà theo em suy nghĩ như thế này không biết có đúng hay không.
Từ khóa ‘ var ‘ trong Linq nó là một kiểu dữ liệu tùy biến tùy theo từng trường hợp của câu truy vấn, như vậy có thể kết luận nó là một kiểu anonymous hay không.
Mong anh giải thích rõ giúp em và các bạn hiểu rõ hơn về từ khóa này.Thank!
@blackha123:Bạn biết lỗi chỗ đó nếu ko đc thì có thể chuyển sang kiểu dữ liệu khác chứ ko nên khư khư 1 kiểu. Bạn làm như trên có lẽ mất đi cái hay của Linq rồi. chỉ cần InsertOnSubmit
VD:
Tb_Khoas K=new Tb_Khoas();
K.tenkhoa=txttenkhoa.Text;
K.Sodienthoai=Sodienthoai.Text;
DataContext d=new DataContext();
d.Tb_Khoa.InsertOnSubmit(K);
@mẫn đạt: Bạn dùng vòng lặp for hoặc foreach để duyệt. Còn nếu cộng trên Gridview thì bạn nên duyệt từng dòng theo tên cột.
@SiNhat: Em xem bài viết này nhé https://namdh.wordpress.com/2011/04/26/var-keyword/
Thank Nguoicungkho so much!man dat da lam duoc roi!
Em chào A Nam
Anh có thể giúp em doạn code, e chưa hiểu ý nghĩa thật sự của nó lắm:
var query=from cust in Customer
select new{Name=cust.Name, City= cust.City}
Cám ơn Anh đã dành thời gian quan tâm.
var query=from cust in Customer
Nó tương đương với câu lệnh select * from customer trong sql server
select new{Name=cust.Name, City= cust.City}
Có nghĩa bạn lọc để lấy ra 2 column là Name, City và bạn đặt tên cho 2 column này sang tên khác (trong trường hợp của bạn đặt tên giống với trong DB).
Toàn bộ câu lệnh của bạn khi biên dịch ra sql sẽ là:
select Name as Name, City as City from Customer
Nếu bạn debug trong Visual thì bạn có thể dễ dàng thấy đc câu lệnh đc biên dịch như thế nào.
Tại sao ở phần 2) Cập nhật một sản phẩm trong CSDL viết bằng C# ta lại khai báo là Product product, trong khi những chỗ khác lại code: var product. Nếu ta đổi Product thành var thì có sao ko, khai báo Product và var khác nhau như thế nào? Mong mọi người giúp đỡ. Cám ơn😀
var query=from cust in Customer
select new{Name=cust.Name, City= cust.City}
Cảm ơn anh nhưng
Vấn đề của em là câu lệnh này Name=cust.Name
Để tạo một phần tử có chứa nhiều hơn một thuộc tính của các phần tử nguồn. Ta có thể sử dụng một đối tượng khởi tạo với một đối tượng có tên hoặc một kiểu giấu tên. Ví dụ sau đây cho thấy việc sử dụng kiểu giấu tên để đóng gói hai thuộc tính từ mỗi phần tử Customer.
@duy: Bạn xem lại bài https://namdh.wordpress.com/2011/04/26/var-keyword/ nhé
“Để tạo một phần tử có chứa nhiều hơn một thuộc tính của các phần tử nguồn. Ta có thể sử dụng một đối tượng khởi tạo với một đối tượng có tên hoặc một kiểu giấu tên. Ví dụ sau đây cho thấy việc sử dụng kiểu giấu tên để đóng gói hai thuộc tính từ mỗi phần tử Customer.” Có nghĩa là nếu em chỉ muốn trả về phần tử là một thuộc tính của cust thì chỉ trả về đúng thuộc tính đó:
var query=from cust in Customer
select cust.Name
Nhưng nếu muốn trả về nhiều hơn một thuộc tính thì có thể tạo kiểu vô danh như trên
Em cảm ơn Anh Nam đã dành thời gian giải đáp thắc mắc của em.
Em xin hỏi anh một chỗ này ma em cũng tìm tòi mà vẫn chưa có cách. Em chi áp dụng đươc theo lối cũ thôi.
Giả sử em có doan code truy vấn bằng Linq như sau:
DataClassQuanLySinhVienDataContext conn = new DataClassQuanLySinhVienDataContext();
var sinhvien = from s in conn.SINHVIENs
from l in conn.LOPs
from k in conn.KHOAs
where
(
((s.MALOP == l.MALOP) && (l.MAKHOA == k.MAKHOA) && (l.MALOP == malop))
)
orderby s.TENSV ascending
select new
{
MaSinhVien = s.MASV,
TenSinhVien = s.TENSV,
Phai = s.PHAI,
NgaySinh = s.NGAYSINH,
NoiSinh = s.NOISINH,
KhoaHoc = s.KHOAHOC,
TenLop = l.TENLOP,
TenKhoa = k.TENKHOA
};
Em muốn thực hiện đưa các thông tin này lên từng textbox ứng với mỗi thông tin.
Em chỉ suy nghĩ được phương pháp này thôi
SqlCommand cmd = (SqlCommand)conn.GetCommand(tenmh);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
Nhưng theo lối mô hình ADO.NET phiên bản trước đây.
Em cảm ơn anh và các bạn.
Anh Nam cho e hỏi là sử dụng LinQ thì có bị tấn công SQL Injection so với 1 số cách viết câu lệnh trực tiếp bằng SQL ko a ?
Không em ạ
@SiNhat: Anh không rõ em hỏi gì
@sinhat:
Nếu bạn làm Linq thì tốt nhất là nên bỏ qua 3-tiers cũ đi vì nó tự gen ra cho bạn rồi.
DataClassQuanLySinhVienDataContext conn = new DataClassQuanLySinhVienDataContext();
var sinhvien = (from s in conn.SINHVIENs
from l in conn.LOPs
from k in conn.KHOAs
where
(
((s.MALOP == l.MALOP) && (l.MAKHOA == k.MAKHOA) && (l.MALOP == malop))
)
orderby s.TENSV ascending
select new
{
MaSinhVien = s.MASV,
TenSinhVien = s.TENSV,
Phai = s.PHAI,
NgaySinh = s.NGAYSINH,
NoiSinh = s.NOISINH,
KhoaHoc = s.KHOAHOC,
TenLop = l.TENLOP,
TenKhoa = k.TENKHOA
}).Single();
txtMASV.Text=sinhvien.MaSinhVien;
….
bạn chỉ cần làm như trên thôi.
Thân
anh nam oi, anh co the giai thich cho em cai nay duoc khong ah, anh giai thich cho em cang de nho thi cang tot ah, em moi tim hieu ve linq thoi
p=>p.ProductName==”Chai”
Em xem bài sau nhé: https://namdh.wordpress.com/2009/07/22/lambda-expression/
Em chao Anh Nam
Em có một câu hỏi mà suy nghĩ mãi vẫn chưa ra.Đó là: Em thấy LINQ đa số đều làm được những gì mà SQL làm được. Vậy nhưng một số người vẫn cho rằng LINQ vẫn có cái chưa làm được mà SQL mới làm được.
Anh Nam hiểu rõ về LINQ. có thể chỉ giúp em chỗ này.
Cám ơn Anh Nam nhiều.
anh ơi cho em hỏi với
em có một thủ tục chèn vào bảng sinhvien(masv ,tensv) như sau
create proc themsv
@Masv varchar(10),
@Tensv nvarchar(50)
as
insert into sinhvien values(@Masv,@Tensv)
exec themsv ‘sv04′,’Hai anh’
và em dùng câu lệnh LinQ gọi thủ tục nay như sau
DataClasses1DataContext cl = new DataClasses1DataContext();
private void btnThem_Click(object sender, EventArgs e)
{
if (kiemtr(txtMasv.Text) == false)
{
cl.themsv(txtMasv.Text, txtTensv.Text);
}
else
{
MessageBox.Show(“Mã trùng”, “thông báo”);
}
anh cho em hỏi em gọi thủ tục bằng LinQ như vậy có đúng k ạ
Em chào anh
ai trả lời giúp em với em dang cần gấp cảm ơn mọi người
Chào anh, em thấy hình như mấy anh chị toàn toàn tạo database rồi mới tạo class, vậy giờ em có một class như sau: class employee là một interface và có 3Hourly_Employee, salary_employee, Consultant vậy thì khi mapping xuống csdl thì em phải khai báo trong lớp datacontext như thế nào để em giải quyết được trường hợp trên.
Thanks mọi người nhiều
Mình nghĩ phải thêm cái “var e =” đằng trước lời gọi Pro kia.
private void btnThem_Click(object sender, EventArgs e)
{
if (kiemtr(txtMasv.Text) == false)
{
var e = cl.themsv(txtMasv.Text, txtTensv.Text);
}
else
{
MessageBox.Show(“Mã trùng”, “thông báo”);
}
@Phạm Mới: Đọc qua thì thấy không có vấn đề gì. Nhưng sao bạn không chạy thử xem có được hay không, nếu không thì hỏi cũng được mà???
@Vũ Đức Toàn: Không cần var e = cũng được bạn ạ, đó chỉ là câu khai báo biến mà thôi, trong trường hợp này thêm vào thành thừa.
@Khách: Trường hợp này với LINQ to SQL em sẽ có 3 table tương ứng với 3 lớp.
Cũng có thể tạo 1 table cho employee và 3 table 3 lớp còn lại, nhưng trường hợp này hơi khó khăn vì LINQ to SQL chỉ cho phép map 1-1 với CSDL. Nếu dùng Entity Framework sẽ có nhiều lựa chọn hơn.
@nhân: Câu hỏi của em không dễ trả lời (vì sẽ tương đối dài). Vậy nên tôi xin kiếu lại và sẽ viết 1 bài đầy đủ về vấn đề này.
mà quên.còn phải cl..SubmitChanges(); nữa mới dc
private void btnThem_Click(object sender, EventArgs e)
{
if (kiemtr(txtMasv.Text) == false)
{
var e = cl.themsv(txtMasv.Text, txtTensv.Text);
cl..SubmitChanges();
}
else
{
MessageBox.Show(“Mã trùng”, “thông báo”);
}
cl.SubmitChanges();
gõ nhầm 2 dấu chấm.
OK Nam. Mình quen viết có var e đằng trước. Mình cũng nghĩ là không cần trong trường hợp này
anh nam ơi, cho em hỏi, em có đọc mấy câu trả lời của anh, em thấy có 1 câu a viết thế này: (Chú ý là LINQ to SQL chỉ được dùng với SQL Server)
vậy là sao anh, chẳng lẽ nó không dung được với mysql ah, em nghe nói tỉnh mở rộng của linq cao mà, sao mà LINQ to SQL chỉ được dùng với SQL Server, anh giải thích giúp em với
LINQ và LINQ to SQL là khác nhau mà, một cái có chữ “to SQL”, một cái không😀
Chào anh Nam!
Em đang làm một bài thực tập: Tìm hiểu Linq, Linq to SQL. Anh có thể cho em ít tài liệu về đề tài đuocjw không ạ. nếu được định hướng giúp em về đề tài được không ạ. Do đây là lần đầu em làm đề tài nên rất lúng túng, khó xác định được phương hướng.
Nếu được em xin cảm ơn anh trước!
Tài liệu thì em cứ vào tag LINQ to SQL thôi, còn đề tài thì em … tự nghĩ😀
Ai cho mình hỏi khi mình muốn update vào CSDL thì mình viết đoạn code sau đây nhưng cứ bị lỗi:
‘”DataClassesDataContext’ does not contain a definition for ‘pd_UpdateChiTietHH’ and no extension method ‘pd_UpdateChiTietHH’ accepting a first argument of type ‘DataClassesDataContext’ could be found (are you missing a using directive or an assembly reference?) ”
// Code C#
protected void Button1_Click(object sender, EventArgs e)
{
string ChiTietHang = Editor1.Content;
string TenHangNgan = tbTenHangNgan.Text;
string MH = tbMaHang.Text;
DataClassesDataContext Groupon = new DataClassesDataContext();
var Update = Groupon.pd_UpdateChiTietHH(ChiTietHang, TenHangNgan, MH);
Groupon.SubmitChanges();
}
// Còn store proc của nó đây
ALTER proc pd_UpdateChiTietHH
(@ChiTietHangHoa Nvarchar(MAX),
@TenHangNgan Nvarchar(50),
@MaHang Nvarchar(50)
)
AS
BEGIN
UPDATE HangHoa
SET ChiTietHH = @ChiTietHangHoa,
TenHangNgan = @TenHangNgan
WHERE MaHang = @MaHang
END;
Trong context của em đã có thủ tục đó hay chưa? (em đã kéo – thả thủ tục của em vào trong cửa sổ design chưa?)
Bạn Nam cho mình hỏi code để kết nối trực tiếp với datadase dùng LINQ với. Vì khi triển khai phần mềm nếu dùng LINQ to SQL bằng design thì các máy khác không truy cập được. Bạn có tài liệu về LINQ to SQL bằng Code thì cho mình xin nhé. Cám ơn bạn
Bạn xem bài Hỏi đáp LINQ (https://namdh.wordpress.com/2008/12/08/linq-faq/), tìm câu hỏi của bạn huongtk3 nhé
chào anh Nam!
cho em hỏi tại sao em tạo liên kết tong linq to sql không được vậy anh,
em cài C# 2008 và sql sever 2005 rồi mà.
hương: Thật khó để trả lời vì quá ít thông tin.
Anh cho em hỏi tí với!
đoạn code của em như vậy mà sao nó cứ báo lỗi chỗ ” ct.GiayChungNhans.DeleteOnSubmit(nsd);” vậy anh. Trong bài của anh có nói “RemoveAll” đã được thay đổi bằng “DeleteAllOnSubmit” mà sao trong C# 2008 không có “RemoveAll”.
private void Form6_Load(object sender, EventArgs e)
{
DataClasses3DataContext ct = new DataClasses3DataContext();
IEnumerable nsd = from c in ct.GiayChungNhans where c.SoGCN.Contains(“G1”) select c;
ct.GiayChungNhans.DeleteOnSubmit(nsd);
ct.SubmitChanges();
}
private void Form5_Load(object sender, EventArgs e)
{
NguoiSuDung nsd = new NguoiSuDung();
nsd.SoCMNDNSD = “205411876”;
nsd.NgayCap1 = DateTime.Parse(“10/12/2002 21:12:10”);
nsd.NoiCap1 = “CA Quảng Nam”;
nsd.TenNSD = “Phạm Thị Hiệu”;
nsd.NamSinh1 = 1987;
nsd.DiaChi1 = “Thăng Bình – Quảng Nam”;
nsd.SoDienThoai1 = “0987654357”;
DataClasses3DataContext ct = new DataClasses3DataContext();
ct.NguoiSuDungs.InsertOnSubmit(nsd);
ct.SubmitChanges();
}
cho em hỏi luôn đoạn này với.
sao đoạn này không báo lỗi mà khi chạy không hiển thị kết quả vậy anh.
Em cảm ơn anh trước!
Hi anh Nam ! Cho em hỏi chút xíu về tìm kiếm unicode trong linq với.
Em đang làm chức năng tìm kiếm trực tiếp trong Linq nhưng vấn đề lỗi ở chuỗi tìm kiếm và kết quả.
Từ khóa tìm kiếm của em là “lap trinh”, dữ liệu là chuỗi “kĩ thuật lập trình bằng Linq”
Kết quả sẽ trả về null. Hiện tại em đang dùng câu lệnh contains để so sánh.
Vậy có cách nào để compare trực tiếp trong Linq ko anh ?
Em search thấy có 1 cách mà chuối quá:
1. Convert chuỗi tìm kiếm về dạng chuỗi không dấu và chữ viết thường.
2. Convert dữ liệu tại trường để so sánh trong database về dạng chuỗi không dấu và chữ viết thường.
3. So sánh 2 chuỗi dữ liệu vừa convert và đưa ra kết quả.
Với cách này thì không thế áp dụng nếu số lượng records nhiều.
Việc tìm kiếm theo cách “mềm dẻo” như vậy thì thường không thể dùng LIKE hay Contains trong LINQ. Các hệ CSDL hỗ trợ việc này thông qua FULL TEXT SEARCH, mỗi hệ quản trị CSDL lại có cách dùng FULL TEXT SEARCH khác nhau nên nếu muốn tìm hiểu cái nào thì em tìm tài liệu cái đó đọc nhé.
Ok! Thanks anh.
Chắc em kết hợp Skip, Take của Linq và SP của Sql Server thôi.
Anh Nam cho em hỏi tí….
Em có 1 CSDL bán hoa..trong đó có 1 bảng là User..Trong User có 1 trường là trạng thái (kiểu bit) “True/False”..(True là còn hoạt động,còn False là user đó hết hoạt động),Làm sao để load những User nào còn hoạt động(Trạng thái = “True”) lên table và khi em ấn nút xóa thì User đó vẫn còn trong hệ thống nhưng chuyển từ Trạng thái == “True” sang Trạng thái == “False”…Em ko bik sai chỗ nào…Mong anh zúp zùm e..e sắp nộp bài oài…
public ActionResult Display()
{
USER b = db.USERs.Single(p => p.TenDangNhap == “zipper”);
return View(b.ToList());
}
[HttpPost]
public ActionResult Delete()
{
USER tam = db.USERs.Single(p => p.TrangThai == true);
tam.TrangThai == false;
db.SubmitChanges();
return RedirectToAction(“Display”);
}
}
}
Cám ơn anh và chúc anh sức khỏe…n
Em load dữ liệu USER = True lên được rùi…e chỉ thắc mắc là sao e ko update những USER từ True –> False (Ấn nút xóa trên form quản lý)..E ko bik bị lỗi zì,a zúp zùm e vấn đề này với…thank a
Lớp ShopHoaOnlineDataContext :
public ShopHoaOnlineDataContext sodc;
public List user()
{
List us = USERs.Where(u => u.TrangThai == true).ToList();
return us;
}
public List sua()
{
var c = from p in sodc.USERs
select p;
foreach (var item in c)
{
item.TrangThai = false;
}
sodc.SubmitChanges();
}
Lớp USERController : Controller
public class KhuyenmaiController : Controller
{
USER d;
//
// GET: /Khuyenmai/
private ShopHoaOnlineDataContext sodc = new ShopHoaOnlineDataContext();
public ActionResult Index()
{
return View();
}
public ActionResult Display()
{
return View(“Display”,sodc.user());
}
[HttpPost]
public ActionResult update()
{
return View(“Display”,sodc.sua());
}
}
Anh đọc code của em mà hoa hết cả mắt *_*
public List sua() sao không thấy return? Nếu không có gì return sao lại trả về List?
Em có 2 cái sodc có kiểu ShopHoaOnlineDataContext, anh không biết dùng như thế nào.
Dạ.code đó của thèn bạn e nó làm.a có thể cho e bik mail của a đc ko..e gửi project qua . E cũng mới học LinQ nên ko bik lỗi ở đâu.Gần đến hạn nộp mà e bí quá.Mong a zúp zùm em.
hello hú hú
var query = from c in dt.DichVuPhongThues
join d in dt.ChiTietDVPhongs
on c.MaDVPhongThue equals d.MaDVPhongThue
group d by d.MaDVPhongThue into dgroup
where dgroup.Key == txtmadv.Text
select new
{
TongTien = dgroup.Sum(groupItem => groupItem.ThanhTien)
};
txttongtien.Text = (query.Sum(o=>o.TongTien)).ToString();
………………………………………………
em co doan code tren nho a kiem tra dum la tai sao e khong tinh duoc tong tien de gan vao textbox txttongtien.text a!
……………………………..
var query = from n in dt.ChiTietDichVus
where n.MaChiTietDV == cbchitietdv.Text
select n.Gia;
int tt = Convert.ToInt32(query.SingleOrDefault(o => o.Value > 0));
int t;
t= tt * Convert.ToInt32(txtsolan.Text);//dong bao loi
txtthanhtien.Text = t.ToString();
…………………………..
con doan code thu 2 thi khi luc insert them mot dong du lieu vao bang chitietdichvu thi lai bao loi o dong tren la input string was not correct format, trong khi e da chuyen sang kieu chuoi het roi a!
….
Som nhan duoc phan hoi cua a.
Anh Nam cho Em hỏi . . . hiện tại E với 1 người bạn làm chung 1 đồ án. Em thì sử dụng LinQ to SQL bạn E thì sư dụng ADO.Net lí do vì 2 đứa kiến thức không tương đồng đó A. lúc làm thì 2 đứa làm riêng.nhưng khi gộp lại thì gặp rắc rối. khi em copy và include file dbml vô project của bạn E thì nó báo code của bạn E bị lỗi không built được (exclude file dbml thi project của bạn E hoạt động bình thường) => A cho E hỏi có cách nào gộp 2 bài của tụi e lại làm 1 được không dậy A?
Không build được vì lỗi gì hả em? Có lẽ do project của bạn em chạy trên .NET 2.0, còn của em là 4.0, nếu vì lý do đó thì em phải chỉnh lại project của bạn em thành 4.0 rồi mới thêm vào được.
Anh Nam ơi
em dùng LINQ load 2 table trên database xuống thì nó không thể edit được các cột. ví dụ như cột string thì không thể thêm chữ, checkbox thì không tích chọn được… dù em để Edittable = true
Làm thế nào để em load 2 table dùng select new { 1 số cột cần lấy trong 2 table } mà có thể edit trực tiếp trên gridcontrol hay datagridview hả anh
Pingback: Cập nhật cơ sở dữ liệu (LINQ to SQL phần 4) - An Le's Blog
Bạn cho mình hỏi trong LinQ mình muốn SELECT TOP 10 của sản phẩm thì làm sao vậy?
Anh ơi Anh có thể giúp em chỗ này với ạ. Em muốn thêm vào table nhiều row một lúc. Khi em thêm lần lượt các phần tử của mảng. Nhưng code bên dưới chỉ thêm được một hàng rồi báo lỗi. em làm mãi ko được. Mong em giúp đỡ em.Thanks a nhiều
KetNoiCSDLDataContext dt = new KetNoiCSDLDataContext();
Email mail = new Email();
string myString = “phuong;hoa;thu;thinh;long”;
char[] separator = new char[] { ‘;’ };
string[] colorList = myString.Split(separator);
for (int i=0; i < colorList.Length;i++ )
{
mail.Title = txttieude.Text;
mail.UserReceipt = colorList[i];
mail.Content = txtnoidung.Text;
dt.Emails.InsertOnSubmit(mail);
dt.SubmitChanges();
}
A ơi Giúp em đi ạ
Anh namdh ơi. Em có 1 chút vấn đề cần a góp ý ạ.
Em đang tập viết Linq Với mô hình 3 lớp. Trong Lop controller em có phương thức kiểm tra login như sau
public bool checkLogin(string name. string pasword)
{
DataDataContext data = new DataDataContext();
var x = from y in data.TBL_Users
where y.UserID == name && y.Password == password
select y;
foreach (var item in x)
{
if (item.isAdmin.Value)
{
IsAdmin = item.isAdmin.Value;
}
else
{
IsAdmin = item.isAdmin.Value;
}
}
return IsAdmin;
}
và trong trang interface em co thiết kế 1 web form Login. với 2 control txtUser và txtPassword.
Khi Nhấn submit Button thì gọi cái phương thức checkLogin của lớp Controller để kiểm tra. Nếu là Admin thì chuyển sang trang addnew.aspx Nếu là User thì chuyển sang trang Details.apsx. Còn nếu sai thì chuyển về sang Login.aspx.
Code :
Class1 classdata = new Class1();
protected void Button1_Click(object sender, EventArgs e)
{
if (classdata.checkLogin(txtUserName.Text, txtPassword.Text))
{
if (classdata.IsAdmin)
{
Response.Redirect(“AddNew.aspx”);
}
else
{
Response.Redirect(“Details.aspx”);
}
}
else
{
Response.Redirect(“Login.aspx”);
}
}
Khi login là user thì lại không chuyển đến trang Details.aspx mà lại chuyển đến trang Login.aspx. Còn đăng nhập Admin thì thành công. Mong anh giúp em với. Đang bị rối chỗ này. Cảm ơn a nhiều.
dạ bổ sung thêm là IsAdmin là một propety kiểu bool và isAdmin là một cột trong table TBL_Users có value la bit(True/False). Mong a giúp em với
Nguyên nhân là hàm của em hơi lộn xộn, 1 hàm làm cả 2 việc là vừa kiểm tra xem có phải là user đã đăng ký hay không, lại vừa kiểm tra có phải là admin hay không nên kết quả trả về bị sai.
Anh sửa lại 1 chút nhé:
public bool checkLogin(string name. string pasword)
{
bool success = false;
DataDataContext data = new DataDataContext();
var x = from y in data.TBL_Users
where y.UserID == name && y.Password == password
select y;
foreach (var item in x)
{
IsAdmin = item.isAdmin.Value;
success = true;
}
return success;
}
Dạ anh namdh ơi, em đã tìm ra nguyên nhân. Nguyên nhân chính là cai hàm CheckLogin. Ở code của em trả về giá trị true/false. Đằng này em chỉ gán giá trị cho IsAdmin.nhưng chưa return true or false. Và khi Client login thì ham CheckLogin chỉ kiểm tra được là Admin, còn user thì không kiểm tra. nhờ code của a e đã tìm ra lỗi của mình. Em sữa lại như sau và nó đã chạy được. Cảm ơn anh rất nhiều:
đây là đoạn code của em:
public bool LoadData(string name, string password)
{
DataDataContext data = new DataDataContext();
var x = from y in data.TBL_Users
where y.UserID == name && y.Password == password
select y;
foreach (var item in x)
{
if (item.isAdmin.Value)
{
IsAdmin = item.isAdmin.Value;
}
else
{
IsAdmin = item.isAdmin.Value;
}
return true;
}
return false;
}
Một lần nữa em cảm on anh nhiều lắm. Em đang mày mò về LinQ. Có gì sai sót mong a giúp đỡ cho. Thân gởi
chào anh, em đang tự tìm hiểu về Linq, khi tạo file Linq to SQL thì nó sẽ tự tạo ra file app.config, e muốn làm 1 form cấu hình khi mang đi máy khác có tên server, id, pass của sql không giống máy mình thì làm thế nào ạ. mong anh giúp đỡ
Bạn xem bài Hỏi đáp LINQ (https://namdh.wordpress.com/2008/12/08/linq-faq/), phần trả lời cho câu hỏi của bạn huongtk3 nhé
bạn ơi minhg muốn xin tài liệu linq to sql với ví dụ demo, mong bạn giúp đỡ, xin cảm ơn
mình muốn tăng số lượng đọc bài lên thì làm sao!
table baiviet(
idbaiviet int,
soluongdoc int)
cảm ơn!

markdown:
Đây là bài viết đầu tiên trong loạt bài có chủ đề “LINQ to SQL”, các bài này sẽ cho bạn một cái nhìn khái quát, giúp bạn làm quen với LINQ, một trong những công nghệ mới có trong .NET 3.5.
Loạt bài này được dựa trên loạt Tutorial của ScottGu (
[http://weblogs.asp.net/scottgu](http://weblogs.asp.net/scottgu)).
### LINQ to SQL là gì?
LINQ to SQL là một phiên bản hiện thực hóa của O/RM (object relational mapping) có bên trong .NET Framework bản “Orcas” (nay là .NET 3.5), nó cho phép bạn mô hình hóa một cơ sở dữ liệu dùng các lớp .NET. Sau đó bạn có thể truy vấn cơ sở dữ liệu (CSDL) dùng LINQ, cũng như cập nhật/thêm/xóa dữ liệu từ đó.
LINQ to SQL hỗ trợ đầy đủ transaction, view và các stored procedure (SP). Nó cũng cung cấp một cách dễ dàng để thêm khả năng kiểm tra tính hợp lệ của dữ liệu và các quy tắc vào trong mô hình dữ liệu của bạn.
### Mô hình hóa CSDL dùng LINQ to SQL:
Visual Studio “Orcas” đã tích hợp thêm một trình thiết kế LINQ to SQL như một công cụ dễ dàng cho việc mô hình hóa một cách trực quan các CSDL dùng LINQ to SQL. Bài viết sau sẽ đi sâu hơn vào cách dùng trình thiết kế này (bạn cũng có thể
[xem đoạn video này](http://weblogs.asp.net/scottgu/archive/2007/01/28/video-using-linq-with-asp-net-in-vs-orcas-part-1.aspx) để xem cách tôi tạo một mô hình LINQ to SQL).
Bằng cách dùng trình thiết kế LINQ to SQL, tôi có thể dễ dàng tạo một mô hình cho CSDL mẫu “Northwind” giống như dưới đây:
Mô hình LINQ to SQL ở trên định nghĩa bốn lớp thực thể: Product, Category, Order và OrderDetail. Các thuộc tính của mỗi lớp ánh xạ vào các cột của bảng tương ứng trong CSDL. Mỗi instance của một lớp biểu diễn một dòng trong bảng dữ liệu.
Các mũi tên giữa bốn lớp thực thể trên biểu diễn quan hệ giữa các thực thể khác nhau, chúng được tạo ra dựa trên các mối quan hệ primary-key/foreign-key trong CSDL. Hướng của mũi tên chỉ ra mối quan hệ là một – một hay một – nhiều. Các thuộc tính tương ứng sẽ được thêm vào các lớp thực thể trong các trường hợp này. Lấy ví dụ, lớp Category ở trên có một mối quan hệ một nhiều với lớp Product, điều này có nghĩa nó sẽ có một thuộc tính “Categories” là một tập hợp các đối tượng Product trong Category này. Lớp Product cũng sẽ có một thuộc tính “Category” chỉ đến đối tượng “Category” chứa Product này bên trong.
Bảng các phương thức bên tay phải bên trong trình thiết kế LINQ to SQL ở trên chứa một danh sách các SP để tương tác với mô hình dữ liệu của chúng ta. Trong ví dụ trên tôi đã thêm một thủ tục có tên “GetProductsByCategory”. Nó nhận vào một categoryID và trả về một chuỗi các Product. Chúng ta sẽ xem bằng cách nào có thể gọi được thủ tục này trong một đoạn code bên dưới.
Tìm hiểu lớp DataContext
Khi bạn bấm nút “Save” bên trong màn hình thiết kế LINQ to SQL, Visual Studio sẽ lưu các lớp .NET biểu diễn các thực thể và quan hệ bên trong CSDL mà chúng ta vừa mô hình hóa. Cứ mỗi một file LINQ to SQL chúng ta thêm vào solution, một lớp DataContext sẽ được tạo ra, nó sẽ được dùng khi cần truy vấn hay cập nhật lại các thay đổi. Lớp DataContext được tạo sẽ có các thuộc tính để biểu diễn mối bảng được mô hình hóa từ CSDL, cũng như các phương thức cho mỗi SP mà chúng ta đã thêm vào.
Lấy ví dụ, dưới đây là lớp NorthwindDataContext được sinh ra dựa trên mô hình chúng ta tạo ra ở trên:
### Các ví dụ LINQ to SQL
Một khi đã mô hình hóa CSDL dùng trình thiết kế LINQ to SQL, chúng ta có thể dễ dàng viết các đoạn lệnh để làm việc với nó. Dưới đây là một vài ví dụ về các thao tác chung khi xử lý dữ liệu:
#### 1) Lấy các Product từ CSDL
Đoạn lệnh dưới đây dùng cú pháp LINQ để lấy về một tập IEnumerable các đối tượng Product. Các sản phẩm được lấy ra phải thuộc phân loại “Beverages”:
*C#:* *VB:*
#### 2) Cập nhật một sản phẩm trong CSDL
Đoạn lệnh dưới đây cho thấy cách lấy một sản phẩm, cập nhật lại giá tiền và lưu lại CSDL.
*C#:* *VB:*
#### 3) Chèn thêm một phân loại mới và hai sản phẩm vào CSDL
Đoạn mã dưới đây biểu diễn cách tạo một phân loại mới, và tạo hai sản phẩm mới và đưa chúng vào trong phân loại đã tạo. Cả ba sau đó sẽ được đưa vào cơ sở dữ liệu.
Chú ý rằng tôi không cần phải tự quản lý các mối quan hệ primary key/foreign key, thay vào đó, tôi chỉ đơn giản thêm các đối tượng Product vào tập hợp Products của đối tượng category, và rồi thêm đối tượng category vào tập hợp Categories của DataContext, LINQ to SQL sẽ biết cách thiết lập các giá trị primary key/foreign key một cách thích hợp.
(Add đã được thay đổi bằng InsertOnSubmit trong phiên bản hiện tại)
*C# * *VB:*
#### 4) Xóa các sản phẩm
Đoạn mã sau sẽ biểu diễn cách xóa tất cả các sản phẩm Toy khỏi CSDL:
(RemoveAll đã được thay đổi bằng DeleteAllOnSubmit trong phiên bản hiện tại)
*C#:* *VB:*
#### 5) Gọi một thủ tục
Đoạn mã dưới đây biểu diễn cách lấy các thực thể Product mà không dùng cú pháp của LINQ, mà gọi đến thủ tục “GetProductsByCategory” chúng ta đã thêm vào trước đây. Nhớ rằng một khi đã lấy về kết quả, tôi có thể cập nhật/xóa và sau đó gọi db.SubmitChanges() để cập nhật các thay đổi trở lại CSDL.
*C#:* *VB:*
#### 6) Lấy các sản phẩm và phân trang
Đoạn mã dưới đây biểu diễn cách phân trang trên server như một phần của câu truy vấn LINQ. Bằng cách dùng các toán tử Skip() và Take(), chúng ta sẽ chỉ trả về 10 dòng từ CSDL – bắt đầu từ dòng 200.
*C#:* *VB:*
### Tổng kết
LINQ to SQL cung cấp một cách hay, rõ ràng để mô hình hóa lớp dữ liệu trong ứng dụng của bạn. Một khi đã định nghĩa mô hinh dữ liệu, bạn có thể dễ dàng thực hiện các câu truy vấn cũng như cập nhật, xóa, sửa dữ liệu một cách hiệu quả.
Hi vọng những hướng dẫn và ví dụ mẫu ở trên đã giúp bạn làm quen với LINQ. Tôi sẽ tiếp tục các bài viết này để giúp bạn khám phá LINQ to SQL một cách chi tiết hơn.
*Các bạn đang xem bài viết trong loạt bài “LINQ to SQL”, loạt bài này được dịch từ blog ScottGu * *http://weblogs.asp.net/scottgu/*
## 224 thoughts on “Sử dụng LINQ to SQL (LINQ to SQL phần 1)”
When insert new record in C#, I can not use like your introduction🙂.
But I can use by this way
db.Categories.InsertOnSubmit(category);
Btw, thanks🙂
there are two ways to insert a new record, the first way is you have to call InsertOnSubmit function as you did. The second way is you can simply add the new record to a collection of objects.
I don’t know why you can not do it, but I can insert in both of these ways😀
Thanks bạn Nam Già nhiều lắm.Bạn đã làm 1 việc rất có ý nghĩa cho mọi người.
Mình thấy BLog ScottGu rất hay.và những bài dịch của bạn cũng rất bổ ích.
Chúc bạn sức khỏe!
He he, thanks
Bạn viết rất hay và kỹ.Nhưng thực ra các bạn có thể vào đây để xem các đoạn video và source code:
http://asp.net
Nhưng mình không hiểu
vd:
NorthwindDataContent db =new NorthwindDataContent();
var products=from p in db.products
select p;
vậy mình muốn đưa từng giá trị của p vào các ô textbox thì mình phải làm như thế nào?
Vì kết quả trả về của câu truy vấn chứa trong biến products là một tập hợp, vậy nên nếu bạn muốn đưa vào các ô text box thì bạn phải chỉ ra dòng nào trong tập kết quả này.
var products=from p in db.products select p;
txtProductID.Text = products.ElementAt(i).ProductID;
Hoặc nếu kết quả của bạn chắc chắn là một dòng thì bạn có thể dùng phương thức mở rộng Single() để lấy về dòng duy nhất đó.
var product=(from p in db.products select p).Single();
và sau đó viết txtProductID.Text = product.ProductID;
Nam cho mình hỏi cái nữa, mình gặp phải vấn đề khi update. Nó cứ hiện ra thông báo là:
Cannot add an entity with a key that is already in use.
Trên mạng, nó có chỉ là phải set null cái DataContext, rồi tạo cái DataContext mới và dùng lệnh:
newDc.[Entitys].Attach(newEntity, true);
nhưng mình vẫn không làm được.
Không biết Nam và mọi người gặp phải trường hợp này chưa?
Thông báo trên có thể do bạn đã thêm một bản ghi với khóa đã tồn tại, trường hợp này chỉ có duy nhất một cách là bạn phải thay giá trị khóa khác để không bị trùng.
Thêm nữa, nếu muốn tạo một đối tượng DataContext mới thì bạn chỉ cần new lại mà không cần đặt null trước, nhưng thực ra việc này có lẽ không giúp ích gì trong trường hợp này.
Cái này là mình làm trong phần update. Xóa cái record rồi insert lại cái đó đã được chỉnh sửa thì ok. Còn update bình thường như đoạn code trên thì nó thông báo lỗi như vậy.
Bạn có thể gửi đoạn code đó lên đây được không ?
Cac ban oi minh la thanh vien moi. Minh moi bat dau tim hieu ve Linq to SQL. Minh thay luc goi doi tuong DataContext nhan vao 1 gia tri la String. Nhung minh chua hieu String nay duoc dung nhu the nao? No co phai la duong dan de luu file database khong? Lam sao de goi no? Giup minh voi. Thankyou
String đó chính là chuỗi “connection string” dùng để kết nối đến CSDL. Bạn có thể tham khảo chuỗi kết nối này trong các sách về ADO.NET để biết cách dùng chuỗi này.
Riêng đối với LINQ to SQL bạn có thể dùng cú pháp sau: Server=;Database=;UserID=;Password=;Trusted_Connection=false;
Trong đó:
là tên máy chủ
là tên CSDL
là người dùng
là mật khẩu
(Chú ý là LINQ to SQL chỉ được dùng với SQL Server)
Bạn Nam ơi, cho mình hỏi tí nhé:
Mình có 1 table là tblUser(username,password)
Mình có 1 form gồm 2textbox là: txtusername và txtpassword. và thêm 1 button đăng nhập.Muốn kiểm tra dữ liệu người dùng nhập vào có đúng với 2 trường đó trong table hay ko thì phải viết đầy đủ như thế nào hả bạn?Mình mới học nên chưa nắm rõ lắm. Nhớ bạn chỉ giúp nha. Thanks….
Bạn có thể viết là:
var c = (from user in context.tblUser where user.username = txtusername.Text and user.password = txtpassword.Text).Count();
Nếu (c == 1) có nghĩa là có 1 cặp username/password khớp với thông tin đã nhập.
Cám ơn những bài dịch bổ ích và những câu trả lời nhiệt tình của anh Nam, chúc anh sức khỏe để còn tiếp tục giúp mọi người nha.
a Nam cho hỏi :
trong câu lệnh : “2.Cập nhật một sản phẩm trong CSDL” nếu mà có 2 sản phẩm cùng tên thì sữa lại như thế nào?
Nếu vậy thì em phải lấy Product thông qua ID, kiểu như sau:
Product product = db.Products.Single(p => p.ProductId == txtProductId.Text);
Rồi sau đó đổi tên như bình thường
Em chưa hiểu đoạn này:
Product product = db.Products.Single(p => p.ProductId == txtProductId.Text);
Cái p ở đây là gì, có phải khai báo hay không, và nó có tác dụng gì trong đoạn code này ạ.
Đây là một biểu thức lambda, viết như vậy có nghĩa mình đang khai báo một hàm anonymous có dạng:
bool f(p)
{
return p.ProductId == txtProductId.Text;
}
Biểu thức lambda rất hay được dùng với LINQ, vì nó giúp code gọn gàng hơn, thay vì phải khai báo một hàm, rồi truyền delegate đến hàm đó vào cho câu lệnh Single, ta có thể viết trực tiếp kiểu như trên luôn.
dùng Linq với Linq to sql có gì khác nhau.Mình mới tìm hiểu,mong các bạn giúp đỡ
anh Nam ơi!cho em hỏi mình dùng StoreProceduce trong Linq như thế nào?Tại sao em không thấy cái Sto nào trong khung explore server?Mong anh giúp em sớm
LINQ là một thành phần trong .NET cho phép bạn có thể viết các câu lệnh theo kiểu truy vấn ngay trong mã nguồn C#, VB (hay các ngôn ngữ được hỗ trợ trên .NET khác), các câu lệnh truy vấn này cho phép bạn làm việc dễ dàng với các tập hợp dữ liệu như array, list… hoặc cả các cấu trúc phức tạp hơn như XML và dữ liệu quan hệ trong 1 cơ sở dữ liệu.
LINQ được cấu thành từ nhiều thành phần, và kiến trúc mở của nó cho phép nhà phát triển có thể xây dựng các thành phần mới dùng LINQ để truy vấn vào các nguồn dữ liệu khác. Mỗi một kiểu thành phần truy cập nguồn dữ liệu sẽ được đặt 1 cái tên như LINQ to Objects, LINQ to XML hay LINQ to SQL (chuyên dùng để truy cập vào dữ liệu trong CSDL SQL Server).
Nếu trong khung Server Explorer không có Stored Proc thì có nghĩa là em chưa có cái nào, em phải tạo mới trước khi dùng.
mình phải tạo nó như thế nào hả anh Nam. Em mới tìm hiểu nên cũng không rõ lắm, anh giúp em với nhé.Cảm ơn anh nhièu
làm cách nào để gọi được lệnh northwind.SubmitChanges();trong linq to sql
bạn nào biết giúp mình với!
Bạn phải tạo một biến DataContext có tên northwind, trong các ví dụ ở bài trên thì biến này được đặt tên là db. Bạn chắc chắn đã phải có biến này rồi vì bạn bắt buộc thông qua nó để thực hiện truy vấn/cập nhật dữ liệu (nếu chưa thì gọi SubmitChanges để làm gì🙂 )
a cho em hỏi là tại sao khi duyệt qua tất cả các phần tử của một DataContext và lấy ra text của từng element (x.ElementAt(i).Text) khi chạy ctr lại báo là không support cái ElementAt??? Khi insert em cũng làm đúng như anh làm và ko có lỗi j xảy ra cả nhưng dữ liệu vẫn “trơ trơ” ko chịu vào csdl là sao anh nhỉ?
– DataContext không phải một tập hợp thì làm sao em có thể duyệt qua từng phần tử được ?
– Sau khi gọi InsertOnSubmit, nếu muốn dữ liệu được đưa thực sự vào CSDL thì em phải gọi SubmitChanges() trong lớp DataContext.
Anh Nam cho em hỏi giả sử em viết một câu truy vấn linq đơn giản trong tầng DataAccess chẳng hạn như:
DataClasses1DataContext db = new DataClasses1DataContext();
var p = from a in db.nviens
select a;
thì em phải trả về kiểu dữ liệu là gì để bên tầng giao diện em có thể gán nó vào một control ví dụ như dataGridView. Cám ơn anh nhiều.
Ban co the convert ket qua tra ve thanh` 1 arrayList cac nvien roi dua vao datagridview
Hi a.Nam, cho tôi hỏi: khi mình tạo 1 Datacontext, Khi mà trong database minh co thay đổi, vd như tên column, tên table, hoặc liên kết table, thi minh phải tạo lai DataContext, và phải sửa lại tất cả code LINQ? làm như vậy nếu đã code n` rồi thì sửa rất là phức tạp. có cách nào khác ko ?
Anh Nam cho em hỏi chút.
Em đang thử dùng LINQ. Nhưng khi em lấy một dòng trong một tập hợp như sau:
MessageBox.Show(products.ElementAt(0).ProductName);
thì chương trình lại báo lỗi là “Query operator ‘ElementAt’ is not supported'”
Em chuyển nó thành
products.toList().ElementAt(0).ProductName
thì lại được.
@văn đạo: Cảm ơn bạn Son đã trả lời giúp, ngoài ra nếu anh nhớ không lầm thì nhiều control cũng hỗ trợ các LINQ data table hoặc query, do vậy em có thể gán luôn biến p vào cho DataSource cũng được.
@Son: tất nhiên rồi bạn ạ, tuy nhiên dùng LINQ to SQL có lợi ở chỗ khi tạo lại data model xong, trình dịch sẽ phát hiện được ngay các câu truy vấn nào cần phải sưa lại cho bạn.
@pvt: Vì products của em thực chất là một câu query, do vậy nó không hỗ trợ ElementAt (cũng như em không thể dùng elementAt trên một tập kết quả SELECT vậy).
Em có một câu hỏi nhỏ là tại sao biến “var” em đánh trong class thì không hiểu mà trong win form lại hiểu. Cám ơn anh
var là từ khóa được dùng để khai báo một biến có kiểu do trình dịch tự xác định, và chỉ được dùng khi khai báo các biến local, tức là bên trong các phương thức – và không phụ thuộc phương thức đó thuộc một lớp winform hay một lớp bình thường khác.
Khi thiết kế DBML, nếu có 2 class có ràng buộc với nhau (Product và Category chẳng hạn), thì tại WCFService khi muốn lấy toàn bộ dữ liệu của Product (trả ra kiểu list) không được.
VD:
public List GetAllProduct()
{
NorthwindDataContext db = new NorthwindDataContext ();
var product = from p in db.Products
select p;
return product.ToList();
}
Nhưng nếu 2 class đó là Product và Customer (không có ràng buộc) thì lại lấy được? Vậy là sao, mong các cao thủ chỉ giáo.
Chào bạn, nguyên nhân gây ra lỗi trên là do việc nạp dữ liệu xoay vòng. Khi gọi ToList(), các Product sẽ load các Category tương ứng, rồi các Category lại nạp tiếp các Product tương ứng, điều này sẽ gây lỗi và service sẽ đóng kết nối.
Để giải quyết vấn đề này, bạn phải chỉnh lại thuộc tính Serialization Mode của mô hình dữ liệu thành Unidirectional (mặc nhiên là None). Chế độ Serialization này chỉ thực hiện việc “serializing” từ lớp cha sang lớp con mà không làm ngược lại (*). Ngoài ra, bạn cũng phải yêu cầu LINQ to SQL nạp các đối tượng con khi thực hiện truy vấn:
NorthwindDataContext context = new NorthwindDataContext();
System.Data.Linq.DataLoadOptions dlo = new System.Data.Linq.DataLoadOptions();
dlo.LoadWith(e => e.Product);
context.LoadOptions = dlo;
var category = from c in db.Categories
select c;
return category.ToList();
(*) Vì tính chất này nên bạn phải lấy Category và con của nó (Product) thay vì lấy các Product như bạn làm.
Bạn có thể tham khảo thêm về vấn đề này tại đây: http://www.codeexperiment.com/post/Returning-LINQ-to-SQL-Entities-From-WCF.aspx
Cám ơn NamDH!
Mình thử chuyển thuộc tính Serialization Mode = Unidirectional thì được luôn, mà không phải viết lại LINQ.
Từ trước tới giờ mình quen thao tác với dữ liệu thông qua DataSet, giờ Silverlight không đọc được DataSet trả về từ WCFService, nên cũng hơi khó khăn, phải bắt đầu với LINQ.
Cậu có tài liệu hướng dẫn bắt đầu với LINQ không, ý nghĩa của các câu lệnh ấy. Đơn giản như câu lệnh này e => e.Product mình cũng chưa hiểu.:D
Quen với SQL Query rồi.
Mình có muốn hỏi mấy vấn đề nữa😀
– Giả sử mình muốn trả ra List chỉ gồm có ProductID, ProductName, CategoryName thì mình phải viết thế nào? Lúc mình trả ra toàn bộ (như kiểu SELECT *) thì được, nhưng khi select new {p.ProductName}, rồi return product.ToList() thì báo lỗi.
– Khi có List như vậy rồi, mình muốn Bind một Column cụ thể vào TextBox như thế nào.
Như DataSet ngày xưa thì là:
TextBox1.Text = DataSetName.Tables[0].Rows[0][“COLUMN_NAME”].ToString();
Bạn có thể tham khảo sách LINQ tại đây: https://namdh.wordpress.com/2008/07/28/linq-book/
Còn câu e => e.Products ở trên thì nó tương tự như việc khai báo một hàm có dạng:
function f(e)
{
return e.Product;
}
Đây là một biểu thức lambda được giới thiệu cùng LINQ, và cũng là một phần “gần như” không thể thiếu khi dùng LINQ (vì vẫn có thể không dùng như sẽ mất công hơn nhiều).
Bạn nói rõ lỗi gặp khi gọi toList() được không ?
http://yfrog.com/3x24156181j
Ý mình là muốn join 2 bảng Product và Category để lấy Tên sản phẩm, Tên Nhóm sản phẩm chẳng hạn
Bạn có thể giúp mình viết phần đó được không? Và cả cách đưa dữ liệu ra 1 Control nữa
Kiểu như thế này:
– Khi có List như vậy rồi, mình muốn Bind một Column cụ thể vào TextBox như thế nào.
Như DataSet ngày xưa thì là:
TextBox1.Text = DataSetName.Tables[0].Rows[0][“COLUMN_NAME”].ToString();
public List GetAllCategories()
{
TAIKHOANDataContext db = new TAIKHOANDataContext();
var product = from p in db.Products
select new
{
p.Category.CategoryName,
p.ProductName
};
return product.ToList();
}
Error:
1) Error 1 Instance argument: cannot convert from ‘System.Linq.IQueryable’ to ‘System.Collections.Generic.IEnumerable’ D:\ASPNet\SilverLight_Login\MyWebService\TAI_KHOAN_SERVICE.svc.cs 54 20 MyWebService
2) Error 2 ‘System.Linq.IQueryable’ does not contain a definition for ‘ToList’ and the best extension method overload ‘System.Linq.Enumerable.ToList(System.Collections.Generic.IEnumerable)’ has some invalid arguments D:\ASPNet\SilverLight_Login\MyWebService\TAI_KHOAN_SERVICE.svc.cs 54 20 MyWebService
Alo, đồng chí NamDH đâu rồi, support cho mình mấy câu hỏi này đi, nghiên cứu mãi mà không ra.
Vì không có chương trình của bạn nên mình khó biết chính xác lỗi gì, nhưng theo thông báo thì có thể nó không thể dùng ToList cho một lớp anonymous (được tạo bởi câu select new
{
p.Category.CategoryName,
p.ProductName
};)
Bạn hãy thử dùng một lớp cụ thể xem sao, ví dụ, bạn có thể tạo một lớp như sau:
class ProductInfo {
public ProductInfo(string pn, string cn) {
this.ProductName = pn;
this.CategoryName = cn;
}
public ProductName()
{ get; set; }
public CategoryName()
{ get; set; }
}
Câu truy vấn sẽ được viết lại như sau:
var product = from p in db.Products
select new ProductInfo
{
p.ProductName,
p.Category.CategoryName
};
Kiểu trả về của hàm sẽ là:
public List<ProductInfo> GetAllCategories()
Bạn thử lại xem, nếu vẫn còn lỗi thì tốt nhất bạn gửi cả project lại đây🙂
Bạn gán giá trị vào TextBox như sau:
TextBox1.Text = myQuery.ElementAt(0).ProductName;
Code của mình đây: http://www.mediafire.com/download.php?ymmwxnz5dqm
Bạn xem lại code giúp mình với nhé. Chạy bắt đầu từ trang Default.aspx, không cần phải gõ Username và Password. Database là Northwind.
Mình không gán trực tiếp giá trị vào TextBox ngay trong hàm đó, nên không thể lấy myQuery được.
Ở ví dụ của mình, tại trang DanhSachKhachHang.xaml, mình có 1 TextBox chẳng hạn, sau khi mình lấy được 1 List Product, mình muốn bind tên product đó vào textbox thì làm thế nào.
Cám ơn bạn rất nhiều!
Ví dụ như mình có 2 bảng HocSinh(MaHS,HoTen,MaLop) và Lop(MaLop,TenLop)
Mình truy vấn như sau:
from hs in context.HocSinhs
from l in context.Lops
where hs.MaLop == l.MaLop
select new
{
hs.MaHS,hs.HoTen,hs.DiaChi,l.TenLop
}
Khi show lên DataGridView thì dữ liệu trong Grid ở dạng readonly. Cho mình hỏi làm cách nào để modify dữ liệu trên Grid vừa show ra ?
Bác chủ Topic đang đi nghỉ mát😀
Alo, bác chủ topic đâu rồi, help me.
Thế này thì chạy OK
public List GetAllCategories()
{
TAIKHOANDataContext db = new TAIKHOANDataContext();
var product = from p in db.Products
select p;
return product.ToList();
}
Thế này thì báo lỗi:
public List GetAllCategories()
{
TAIKHOANDataContext db = new TAIKHOANDataContext();
var product = from p in db.Products
select p.ProductName;
return product.ToList();
}
Quên, hàm trả ra kiểu List nhé!
[code]
Trả ra kiểu List
[code]
Chà, mấy ngày này bận quá nên không trả lời “hộp thư truyền hình” được, sorry các bạn.
Ban ngày làm việc ở công ty, rồi lại đón con, chăm con (2 vợ chồng phải chăm 2 nhóc), chuẩn bị ra mắt phiên bản kế tiếp của StockViewer, hoàn thành những bước cuối cùng về kỹ thuật của 1 webgame, chuẩn bị các thủ tục để mở công ty, thử nghiệm các tính năng của Android và Silverlight mới, tập tành viết ứng dụng cho N97…
Giải quyết các nhiệm vụ trong Rainbow Six, xong rồi chuyển sang Call ỏ Duty 4 (đã xử lý xong thằng 5 rồi)😀.
Thầy mở công ty ạ. Công ty về lĩnh vực gì ạ. Chắc là cung cấp webgame. :)) E đoán thế. Bận thế lại còn call of duty. Thầy chia time kiểu gì mà tài quá. Thật là ngưỡng mộ. Chia sẻ cho em với.
Trời, mới post xong đã có reply rồi, nhanh quá. Thật là ngưỡng mộ.
Thực ra thì dù thời gian có eo hẹp đến đâu thì cũng cần phải để lại chút ít để relax, đó là lúc tái tạo sức lại động mà, có thể nghỉ ngơi, nghe nhạc, hoặc làm điều gì mình thích (chơi game :D). Nghỉ ngơi cũng là cách làm việc hiệu quả mà.
Có việc muốn hỏi tiếp ông bạn đấy😀 Chờ nhé!
Hix, sợ quá😀
Anh Nam ơi, em bây giờ muốn tìm hiểu về LinQ vậy anh có thể cho em một ví dụ đơn giản trên winform có sử dụng LInQ được ko? Em đang rất cần. Em cảm ơn anh nhiều.
Em mong sớm nhận được phản hồi của anh!
Cả nhà mình có ai tìm hiểu trên Winform rồi thì chỉ giáo giúp mình nhé. Cảm ơn mọi người nhiều1
LINQ thì dù có dùng trên ASP.NET hay dùng trong Windows Form thì cũng như nhau thôi em ạ.
Nếu em đã từng dùng ADO.NET rồi thì cứ thế mà áp dụng vào cho LINQ thôi🙂
DataClasses1DataContext bdd = new DataClasses1DataContext();
IEnumerable acc = bdd.pro_login(txt_User.Text, txt_Pass.Text);
//var acc = bdd.pro_login(txt_User.Text,txt_Pass.Text )
if (acc.Count()!=0)
{
foreach (account item in acc)
{
if (item.isadmin.Value==true)
{
Response.Redirect(“insert.aspx”);
}
else
{
Response.Redirect(“welcome.aspx”);
}
}
}
else
{
lbl_ThongBao.Text = “Tài khoản hoặc mật khẩu không đúng!!!”;
txt_User.Focus();
}
em viet nhu the nhung no lai bao loi, yeu cau cua e la , neu la thanh vien dang nhap thi cho vao trang welcome, neu thanh vien la admin thi cho vao trang insert, con neu sai tai khoan,thi xuat hien thong bao, nhung e viet nhu the, no lai bao loi la “The query results cannot be enumerated more than once. ” khi e nhap thong tin ve tai khoan dung.
bo sung chut, pro_login la store nhe, isadmin la 1 cot trong bang csdl kieu bit(true/false)
em không thể enum một query 2 lần (1 lần trong count). với đoạn code trên thì em có thể viết:
bool found = false;
foreach (account item in acc)
{
if (item.isadmin.Value)
{
Response.Redirect(”insert.aspx”);
}
else
{
Response.Redirect(”welcome.aspx”);
}
found = true;
}
if (!found)
{
lbl_ThongBao.Text = “Tài khoản hoặc mật khẩu không đúng!!!”;
txt_User.Focus();
}
nhưng nếu dùng SP thì cách trả kết quả như vậy có vẻ không hiệu quả, em nên kiểm tra ngay bên trong thủ tục và sau đó trả về mã kết quả (0 = not found, 1 = normal user, 2 = admin…) thì hay hơn.
SP của em giống vầy
“ALTER PROCEDURE pro_login
@user varchar(20),
@pass varchar(10)
AS
select * from accounts
where username=@user and pass=@pass
return @user,@pass”
giờ sửa như thế nào cho giống ý anh, hi, em ngốc lắm, phiền a chút nha
em viết giống như sau:
ALTER PROCEDURE pro_login
@user varchar(20),
@pass varchar(10)
AS
DECLARE @isadmin BIT
select @isadmin = isadmin from accounts
where username=@user and pass=@pass
IF @isadmin IS NULL
RETURN 0
ELSE
IF @isadmin = 0
RETURN 1
ELSE
RETURN 2
GO
Anh viết chay thôi, em về test và sửa lại cho chạy nhé.
Nhưng các anh chị ơi cho em hỏi là:những câu truy vấn trên chúng ta viết vào đâu vậy ạh.ví dụ như em muốn hiển thị dữ liệu len một listbox thì phải viết các câu truy vấn trên vào chỗ nào.
Chỉ dùm em với.
Cho mình hỏi tí nhé:
Mình có 1 table là login(userid,pass,role)
Mình có 1 form gồm 3textbox là: txtTK, txtMK,txtrole và 1 datagridview
Mình muốn là khi click vào bất kì 1 cell trong DataGridView thì sẽ xuất hiện userid lên txtTK
Giúp mình nha.ty
Hi anh,
Lâu quá không gặp, hi vọng anh vẫn “phong độ” như ngày nào.
Có một vài câu hỏi định send private cho anh, nhưng mà ko tìm được email. Đành spam ở đây vậy🙂
1. Em định trích dẫn bài viết của anh ở trang web riêng, vậy hi vọng anh cho phép, đó cũng là một cách để chia sẻ cho mọi người phải không anh ?
2. Em đang định viết bài về LinQ trong mô hình 3 lớp … Nếu anh đã có kinh nghiệm thì hi vọng anh góp ý cho em tham khảo.
Cảm ơn anh🙂
He he, dạo này bận quá nên hết “phong độ” rồi🙂
1. Em có thể trích dẫn các bài viết trên blog của anh. Tất cả các bài viết trên blog của anh đều có thể đăng lại mà không cần hỏi ý kiến anh, thậm chí có thể không cần đăng tên tác giả, tuy nhiên nếu đã đăng tên thì hi vọng đó sẽ là tên anh :)).
2. Ok, việc đầu tiên phải là viết các đã, rồi anh mới góp ý được.
LINQ and SQL, công nghệ mới này là mình không cần phải viết các thủ tục trong store procedure của sql nữa phải không Anh. Mình chỉ việc sử dụng công nghệ này là ok rồi phải không.
Vì hông hiểu nên hỏi, mong anh chỉ cho
Không em ạ, LINQ to SQL cho phép truy cập SQL Server chứ không phải để thay thế các đối tượng CSDL. Em vẫn phaari viết SQL Procs như bình thường.
Em muốn nhập thông tin tim kiếm dữ liệu, nếu trong SQL em dùng
where ten like %’abc’%
vậy với LinQ thì cách dùng như thế nào? Anh Nam chỉ giùm em với !
Chúc công việc của anh thuận lợi nhé !
Ặc, chào người hâm mộ.
Em có thể dùng câu lệnh Like như trong SQL, ? thay cho 1 ký tự bất kỳ, * thay cho một chuỗi ký tự bất kỳ (tương tự dấu % trong SQL).
Cảm ơn em vì lời chúc
Cám ơn anh Nam nhé.
Em cũng mới tìm hiểu được. Thay vì dùng toán tử LIKE trong SQL thì mình có thể dùng ‘Contains’ để thực hiện việc tìm kiếm tương đối.
VD để thực hiện tìm kiếm sinh viên theo Ho_Ten từ bảng SinhVien ta làm như sau :
using(DataClasses1DataContext _db=new DataClasses1DataContext())
{
var _ab= from p in _db.SinhVien
where p.Ho_Ten.Contains(“abc”) ;
select new {p.Ho_ten,p.ID}
}
Ngoài phương pháp này các bạn còn có thể dùng phương pháp khác.
Thay vì dùng LIKE và sử dụng dấu “%” như ‘%chuỗi_so_sánh%’ trong SQL, chúng ta có thể thay thế EndsWith và StartsWith cho dấu % bên phải hay trái.
ví dụ :
using(DataClasses1DataContext _db=new DataClasses1DataContext())
{
var _ab= from p in _db.SinhVien
where p.Ho_Ten.EndsWith (“abc”) ;
select new {p.Ho_ten,p.ID}
}
và …..
using(DataClasses1DataContext _db=new DataClasses1DataContext())
{
var _ab= from p in _db.SinhVien
where p.Ho_Ten.StartsWith (“abc”) ;
select new {p.Ho_ten,p.ID}
}
Đúng vậy, tùy sở thích em dùng cách nào cũng được vì nó sẽ cho kết quả tương đương. Bản thân Like, Contains, Startswith… cũng sẽ đều được dịch thành mệnh đề LIKE của SQL.
Cái report của devexpress được thiết kế như thế nào anh nhỉ? các bước xây dựng report í.
em xem video hướng dẫn nhưng mà không hiểu mấy. anh chỉ giùm em vài chiêu nha’.
Em đã tham chiếu tới thư viện SQLConnection và SQLDataAdapter. Tạo kết nối tới database
nhưng sau khi em chọn tên server và database chuyển qua bước chọn table và field thì không được, nó không hiển thị các table và field cho mình chọn.
Nguyên nhân tại sao vậy anh Nam !
Ờ ờ, anh chưa dùng cái report của nó bao giờ nên cũng không biết (gãi gãi đầu :”> )
Mình cũng đang nghiên cứu LINQ, mình đang dùng nó làm DAL ! cái luân chuyển giữa các tầng là entity ! nhưng mình ko hỉu 1 hàm trong DAL khi xay dựng bằng LINQ như thế nào ? mình không biết làm sao chuyển từ kết quả trả về của biểu thức Lambda(1 collection) sang entỉy cả !
public Phanphoi goisv()
{
DALDataContext sp = new DALDataContext();
Phanphoi pp = new Phanphoi();
tim = from p in sp.Phanphois select new {p.Manhapp,p.Tennhapp};
return tim;
}
Để dễ dàng, bạn có thể sửa lại hàm như sau:
var pp = from p in sp.Phanphois select new Phanphoi(){manhapp:=p.Manhapp,tennhapp := p.Tennhapp};
if (pp.Count() == 1)
return pp.Single();
else
return null;
Ai co sach ve Linq to SQL share cho minh tham khao voi.
Ở đây bạn ơi: https://namdh.wordpress.com/2008/12/04/linq-book/
Một ngày đẹp trời em bị lỗi này:”String or binary data would be truncated.
The statement has been terminated” khi thêm Product với Category khi gõ ví dụ trên của anh. Em không hiểu vì sao nó lại ngăn ko cho dùng string với binary. Anh Nam hel…..p em😦
Lỗi này xuất hiện khi em đưa giá trị vào 1 cột mà chiều dài chuỗi lại lớn hơn độ rộng của cột khai báo trong CSDL, em kiểm tra lại nhé.
Mấy huynh ơi giúp đệ với. Đệ bị lỗi này nè. Không connect được
![](https://i2.wp.com/c.upanh.com/uploads/30-Dec-2009/6vxczvvirui9sz1qta6i.jpg)
Thanks
wow pro :)) thanks anh
@xmen: Có vẻ như em đang dùng VS 2008 để truy xuất vào SQL 2005. Nếu đúng như vậy thì em vào link sau: http://www.microsoft.com/downloads/details.aspx?FamilyId=C6C3E9EF-BA29-4A43-8D69-A2BED18FE73C&displaylang=en#filelist
Sau đó tải về và cài đặt các thành phần sau đây:
* Microsoft SQL Server System CLR Types
* Microsoft SQL Server 2008 Management Objects
* Microsoft SQL Server 2008 Native Client
Chúc may mắn
Thanks a Nam. Em update thằng VS2008 lên SP1 là OK rồi. Có j thắc mắc cho e hỏi tiếp nha.
anh oi cho em hoi xem tai lieu hoc LINQ TO SQL duoc khong ha anh!!!
Khi update, mình muốn kiểm tra field nào được thay đổi bằng property GetChangeSet() của dataContext để ghi lại log có dc kg? hay phải dùng cách thường là check từng field một?
Thanks
Anh nam ơi anh có thế nói giúp em ý nghĩa của các từ khóa trong linq to sql được không.
ví dụ :var,single…
em chỉ hiểu lôm na từ khóa var kiểu như trả về 1 tập các đối tượng thì phải,còn từ khóa single không hiểu ý nghĩa của nó em chỉ biết khi xóa và cập nhật sau khi sửa 1 bản ghi thôi.
mong anh chỉ giùm em ạ!
@nhanbh: Được, nhưng không rõ bạn muốn log thế nào
@vu hoang: Chà nếu chỉ hết thì sẽ rất nhiều, vụ này chỉ có thể giải quyết được bằng cách đọc MSDN thôi, cố lên em, vừa nâng cao kiến thức vừa củng cố vốn tiếng Anh chuyên ngành.
@nguyen quoc tuan: Đây nhé em https://namdh.wordpress.com/2008/12/04/linq-book/
Product product = db.Products.Single(p => p.ProductId == txtProductId.Text);
Anh ơi anh giải thích câu lệnh này giúp em với ah em chưa hiểu lắm và nếu em ko dùng Single mà dùng SingleandDefault thì có khác nhau như thế nào ah ?????
public List GetOneCategories(int ID)
{
DataClassesDataContext db = new DataClassesDataContext();
/*
*
*/
var cate = from c in db.Categories
where c.CategoryID == ID
select new Category
{
Description = c.Description,
CategoryName = c.CategoryName
};
var myList = cate.ToList();
return myList;
}
Sao mình viết như thế này lúc search theo ID lại không được nhỉ? Giúp với. Ý mình là muốn select 1 số column thôi, rồi chuyển về List để hiển thị trong Grid của Silverlight ấy mà.
Alô, sao không có ai giúp mình vậy?
@Hoa Nhật Quỳnh: Product product = db.Products.Single(p => p.ProductId == txtProductId.Text);
p => p.ProductId == txtProductId.Text là một biểu thức Lambda, em đọc thêm bài sau để tìm hiểu nhé: https://namdh.wordpress.com/2009/07/22/lambda-expression/
Còn Single và SingleOrDefault dùng để trả về một dòng duy nhất, nếu tập kết quả có nhiều hơn 1 dòng thì sẽ throw InvalidOperationException.
Sự khác nhau là trong trường hợp tập kết quả rỗng thì Single sẽ throw InvalidOperationException, còn SingleOrDefault sẽ trả về một đối tượng có giá trị mặc nhiên (0 nếu là số, null nếu là kiểu reference type… – tương tự như giá trị trả về của từ khóa default trong C#)
@Scorpion: không rõ lỗi em nói tới là lỗi gì😦
Trong trường hợp này có thể có vấn đề xảy ra nếu Category là một lớp entity tạo ra bởi LINQ, trường hợp này em phải tạo một class mới để chứa kết quả trả về hoặc đơn giản là dùng lớp anonymous:
…
where c.CategoryID == ID
select new
{
c.Description, c.CategoryName
};
Còn nếu không phải lỗi này thì em phải post thêm lỗi mới biết được.
public List GetOneCategories(int ID)
{
DataClassesDataContext db = new DataClassesDataContext();
/*
*
*/
var query = (from c in db.Categories
where c.CategoryID == ID
select c).first();
return new Category
{
Description = query.Description,
CategoryName = query.CategoryName
};
thầy Nam cho em hỏi là em có 1 câu query là “select distinct left(productname) from product” thì phải làm sao
Anh không rõ yêu cầu của em lắm nhưng anh đoán em muốn 1 câu query giống thế này:
var productNames = (from p in dataContext.Products select p.Name.SubString(0, 5)).Distinct();
dạ ko, ý em là em muốn làm 1 cái list sản phẩm theo ký tự đầu của chúng. nên em muốn lấy ra các ký tự đầu của sản phảm và tương ứng với ký tự đầu đó sẽ là tên các sản phẩm có cùng ký tự đầu. vì dụ như: “select distinct left(productname,1) from product” nó sẽ trả ra 1 list các ký tự đầu tiên từ a-z nếu như chữ cái đầu tiên của sản phẩm có kí tự đó. thật tình thì nó giống như trang này http://www.nativeremedies.com/petalive/products.html. Em muốn select ra 1 list các kí tự đầu tiên của sản phẩm để làm tiêu đề và tương ứng với tiêu đề sẽ là các sản phẩm có chữ cái đầu tiên trùng với tiêu đề. xin anh giúp em
vậy thì cũng là câu lệnh trên, nhưng thay số 5 bằng số 1 để chỉ lấy về ký tự đầu thôi
vậy cho em hỏi nếu em muốn làm 1 câu lệnh như thế này “select * from product where productname = select distinct left(producname,1) from product thì câu lệnh trong linq la như thế nào
xin chào anh Nam và các bạn
Hiện e là người mới bắt đầu nghiên cứu silverlight, nhưng khi thao tác trên LINQ e không biết cách dùng store proceduce (insert, update, delete) thông qua WCF, , e chỉ dùng được mỗi cái sp duy nhất là Get(dùng câu truy vấn select mà thôi).Có thêm xóa sửa được xin chỉ em dùm
cách lấy sp của em làm dc sp lấy dữ liệu mà thôi:
public List getData()
{
var sql = db.GETDATA();
return sql.ToList();
}
chào em, nếu muốn truy cập dữ liệu từ Silverlight client, cách đơn giản mà hiệu quả nhất là dùng Ria Services. Em có thể học về nó qua loạt bài sau: https://namdh.wordpress.com/tag/ria-services/
@alonedragon: anh không hiểu câu SQL của em định làm gì cả😦
a` anh Nam ơi e hỏi cái, cái girdview lọc theo điều kiện của dropdownlist trong bài 5, bước 4 : Lọc danh sách sản phẩm . Nếu em muốn thêm 1 điều kiện All vào dropdownlist tức là hiện tất cả products thì phải làm sao? em đã thử thêm điều kiện All và xử lý sự kiện indexchanged riêng của dropdownlist nhưng khi gridview hiện ra tất cả thì nó ko còn chức năng auto sort, paging, update, delete nửa và khi chọn category khác trong dropdownlist thì nó ko còn hiệu lực nửa😀
tượng tự viết một hàm tìm kiếm dùng cái girdview đó luôn thì nó tìm ra nhưng chức năng sort paging update delete và lọc danh sách theo dropdownlist cũng mất luốn ^^!
@Loc: Em có thể post đoạn code của em lên không?
Theo anh đoán thì có thể do sự khác nhau giữa các câu truy vấn dẫn đến kiểu của tập kết quả khác nhau (IQueryable và IOrderedQueryable chẳng hạn)
Anh Nam cho em hỏi nếu mình tạo một dự án ứng dụng trên web thì cơ sở dữ liệu lưu ở đâu nếu chương trình này cho phép nhiều người sử dụng
Em đã đọc nó nhưng mà toàn tiếng anh với lại e cũng chưa hiểu, e muốn tạo một lớp csdl và gọi các service từ WCF lên, em suy nghĩ mà vẫn chưa tìm ra được. Mong anh giúp đỡ. thanks
Hầu hết các CSDL hiện nay đều hỗ trợ nhiều người dùng, ngay cả các CSDL dựa trên file như Access, SQlite, SQLCE… (tất nhiên các CSDL file based còn có nhiều hạn chế về mặt này).
Em có thể dùng SQL Server, Oracle hay Mysql và tạo kết nối đến nó, với các CSDL chuyên nghiệp này, việc sử dụng cho các website là hoàn toàn dễ dàng.
Em cũng đang sử dụng sql server nhưng là khi chuyển qua linq thì không còn làm theo cách ado.net được nữa, khi xưa em chỉ cần viết 1 lớp cơ sở để thực hiện việc thêm xóa sửa, sau đó mình chỉ cần truyền tên của Store vô là được nhưng với linq thì e chưa làm được điều trên.Ở wcf em viết các hàm insert , update, delete chuẩn sau đó em qua lớp .cs để gọi các hàm từ wcf service nhưng hiện tại e vẫn chưa biết cách làm, anh có thể giúp em được không
“nhưng với linq thì e chưa làm được điều trên” – anh nghĩ đã có LINQ to SQL thì em không cần làm điều trên nữa.
Còn về WCF thì em có thể tìm một số tài liệu về nó để học, các yêu cầu của em cũng khá đơn giản nên anh nghĩ em có thể làm được nhanh thôi.
Trong Linq khi ta kéo Table vào thì nó sẻ mô hình hóa table thành lớp. Trên thực tế em đang gặp một hệ thống gồm nhiều ứng dụng hợp lại, người ta thường gọi là ERP. Trong ERP thường ít nhất là 5 chức năng : Kế toán , Quản lý Kho, Quản lý Nhân Sự, Quản lý Bán Hàng, Quản lý Tài Chính,…..nếu tập hợp lại thì csdl có thể lên tới con số 1000 table, em có nên tạo nhiều linq to sql không anh Nam?
anh Namdh ơi!
Cảm ơn anh vì bài viết hay về LINQ.
Em hỏi anh một vấn đề:
Giả sử em có một trang đăng nhập.
Có 1 file .txt chứa DB về User và Pass
em muốn xây dựng đoạn code trên C# để đưa DB trên vào.
Anh giúp em với.Thank much!
@linhduy: Hoàn toàn được và nên làm như vậy
Có nghĩa là em copy user/password từ database vào file txt? Vậy thì chỉ đơn giản là làm một câu query từ database rồi write vào file thôi, quá đơn giản nhỉ?
@namdh: không anh hiểu sai ý em roài! ý em là ngược lại ý của anh.
Em mới học về cái này nên chưa biết nhiều lắm.
Vậy thì đọc file text rồi insert vào database thôi, cũng đơn giản không kém.
anh Nam cho em hỏi cách nào để so sánh dữ liệu nhập vào trước khi mình gọi store insert hay câu linq insert.
E dùng WCF thì nó bị lỗi. So sánh thì được nhưng mà khi insert chỉ được một lần, insert thêm 1 lần nữa là nó báo lỗi liền.
Code WCF Service
/////////////////////
public bool Diploma_Compare(string id)
{
var q = (from v in db.D_BangCaps
where v.BangCapID == id
select v).Count();
if(q > 0)
{
return true;
}
else
{
return false;
}
Anh Nam ơi cho em hỏi, mình viết một câu lệnh insert trong wcf service như thế nào vậy anh
LinQ quá hay!
Nhưng không biết anh Nam ơi, có chương trình nào, hay trang web nào chuyên chuyển đổi từ câu lệnh SQL sang dạng LinQ trong C# không nhỉ.
Thân chào, cảm ơn.
hiện tại em đang có 1 vấn đề với Linq này mong anh Nam giúp đỡ em với.
Giờ em có 1 đoạn code thế này:
int count = 0;
DataClassesDataContext dc = new DataClassesDataContext();
string sql = “select Count(*) from A where validtime-getdate()0”;
dc.Connection.Open(); using(dc.Transaction=dc.Connection.BeginTransaction())
{
count =dc.ExecuteCommand(sql);
dc.Transaction.Commit();
}
dc.Connection.Close();
Giờ em đếm số record trong DB ra ngoài biến count để show ra giao diện.
với câu lệnh trong sql thì nó show đúng rồi nhưng khi chạy qua Linq thì nó lại trả về -1.
Anh giúp em với. thanks anh nhiều
Oh, đoạn code này trong không giống LINQ tí nào.
Em có thể viết đơn giản là:
var c = (from a in dc.A where …).Count();
Thế là xong
Không đc đâu anh, vì nếu như viết theo dạng như anh nói thì trong Linq không cho phép so sánh ngày tháng trực tiếp như trong SQL. Ý em là muốn đem câu lệnh sql vào trong Linq luôn.
Em ví dụ thế này: giờ em có ngày 10/10/2010 là ngày hết hạn. Em cần so sánh nó với ngày hiện tại xem còn bao lâu nữa thì bị hết hạn cũng như sắp hết hạn để thông báo cho user cập nhật thông tin.
string sql = “select Count(*) from A where validtime-getdate()>0″;
count =dc.ExecuteCommand(sql);
Chào a. E thấy bài viết anh rất hay . E muốn copy bài anh sang http://geeksship.com/Site/Home/Index.aspx
Cám ơn anh nhiều nha!!!
@Dương Đăng Quốc : Không biết có đúng í anh không vì linq có thể sử dụng sp ,LinQ truyền vào giá trị có dạng System.Datetime rồi trong sp sẽ xử lí .
Cảm ơn anh namdh nhiều, các bài của anh rất bổ ích và dễ hiểu . Không biết trong web của anh có bài nào viết về biểu thức lambda không em thấy phía trên anh có sử dụng, em mong được anh chia sẻ 1 bài viết về lambda .
sr anh vì em chưa search đã đặt câu hỏi😦
https://namdh.wordpress.com/2009/07/22/lambda-expression/
xin chao moi nguoi!!!!
em hiện đang là sinh viên. nay em đang tìm hiểu một đề tài về linq và asp.net MVC. hiện em có 1file sql khi em tao file linq to sql sau do em connect file sql đó vào nhưng ko đc dữ liệu gi cả. mong mọi nguòi chi guip em voi! thanks!
cac anh oi cho e hoi chut! e co co so du lieu trong sql server 2005 e back up roi sau do e tao file linq to sql classes sau do e connection toi file back up do nhung no bao la file buck up ko ton tai.
mong cac anh giup e voi e dang can gap!
thanks
@Dương Đăng Quốc: nếu vậy em xem bài 8 nhé: https://namdh.wordpress.com/2009/08/03/excecuting-custom-exp-linq-to-sql-part-8/
@vansydlu: câu hỏi của em mơ hồ quá
y cua e la. e co 1 file back up cua sql server 2005. e co the tu linq to sql connection toi file do duoc ko?
va so the thi lam nhu the nao duoc ha a?
Anh cho em hỏi là quá trình đóng mở connection của LINQ này như thế nào nhỉ?
h= new QlBan_HangDataContext();
var nguyen = from g in h.Danh_Muc_San_Phams
where g.Ma_San_Pham==int.Parse(txtMa_San_Pham.Text)
select g;
* h.Danh_Muc_San_Phams.DeleteOnSubmit(nguyen);
h.SubmitChanges();
loi bao dong * nhu the nay:
Argument ‘1’: cannot convert from ‘System.Linq.IQueryable’ to ‘CSDL.Danh_Muc_San_Pham’
A giup e khac phuc loi voi. Chi e Convert. Thanks.
E dung QLBan_HangDataContext la classlibrary.
E build va using roi.
Em đổi DeleteOnSubmit thành DeleteAllOnSubmit hoặc dùng Single để lấy 1 sản phẩm duy nhất.
e chay duoc roi. a giai thich ro cho e duoc ko. khac nhau gi vay.
voi lai cai table nua. hi. ep kieu datatable cho var ko duoc ha a.
truoc gio e van ep bang sqlcommand;
khong biet co cach khac khong. hi.
thanks a nhieu
a cho e hoi them la cai table trong linq khac datatable trong C# nhu the nao. hi.
sao ko thay tra loi e vay. giup e voi.
a.Nam Giup minh voi
Mình tạo thử trang này http://lichsu.vn các bạn thử xem sao! Đừng chém nhé!
Bạn có thể đổ dữ liệu vào DataGridview
var student = from a in ketNoiDuLieuDataContext.Students
join b in ketNoiDuLieuDataContext.StudentsJoinClasses on a.StudentId equals b.StudentId
where a.ProvinceId == Id
select new { a.StudentId, a.FirstName, a.LastName, a.PermanentAddress, b.PaymentAmount };
dataGridView1.DataSource = student;
Ở trên là mình đổ dữ liệu là thông tin students vào GridView dựa vào những students có ProvinceId được chọn trên Combobox.
Lần đầu tiên,Có gì sai mong góp ý!
cho mình hỏi mình đang làm linQ với Visual studio bây giờ sau khi load thông tin của 1 thành viên qua 1 form khác nếu có lưu lại những chỉnh sửa thì ta phải làm như thế nào…cập nhat lại thông tin cho thành viên đó
Great Blog ^^
Happy New Year 2011
a nam oi! e dang gap vuong mac cho nay a giup e voi
.Gia su trong SQl 2005 e viet ham nhap khoa:
ALTER proc [dbo].[sp_Nhapkhoa]
@makhoa nchar(10),
@tenkhoa nvarchar(150),
@Sodienthoai nchar(10),
@trangthai bit
as
if (not exists(select makhoa from Tb_Khoa where makhoa=@makhoa))
begin
insert into Tb_Khoa(makhoa,tenkhoa,Sodienthoai,Trangthai) values(@makhoa,@tenkhoa,@Sodienthoai,@Trangthai)
end
else
begin
update Tb_Khoa set tenkhoa=@tenkhoa where makhoa=@makhoa
update Tb_Khoa set Sodienthoai=@Sodienthoai where makhoa=@makhoa
update Tb_Khoa set Trangthai=@Trangthai where makhoa=@makhoa
end
return
Tren C# ta viet ham goi lai:
public bool Nhap_khoa(string Makhoa, string Tenkhoa, string Sodienthoai,string Trangthai)
{
try
{
SqlParameter[] p =
{
new SqlParameter(“@Makhoa”,SqlDbType.NChar,10),
new SqlParameter(“@Tenkhoa”,SqlDbType.NVarChar,150),
new SqlParameter(“@Sodienthoai”,SqlDbType.NChar,10),
new SqlParameter(“@Trangthai”,SqlDbType.Bit)
};
p[0].Value = Makhoa;
p[1].Value = Tenkhoa;
p[2].Value = Sodienthoai;
p[3].Value= Trangthai;
int rowsAffected = ExecuteNonQuery(“SP_Nhapkhoa”, p);
return rowsAffected == 4;
}
catch
{
return false;
}
}
khi ta tao Winform:se co 3 textbox va 1 checkbox(trang thai).
button nhap co code nhu sau:
private void button1_Click(object sender, EventArgs e)
{
if (dulieu.Nhap_khoa(txtma.Text, txtten.Text, txtsdt.ToString(),checkBox1.Checked.ToString()) == true)
MessageBox.Show(“Nhap thanh cong”);
}
nhung chay chuong trinh ko dc a oi.e biet la no loi kieu du lieu so dien thoai(nchar)va trang thai(bit)nhung e ko the khac phuc dc.a co the giup e dc ko?.Thanhk anh nhiu nhiu!!
Chào a Nam!cho e hỏi vấn đề này nhé,trên form order của e,e muon tính và hiển thị cột tổng tiền trên datagirlview,nhung e ko bt làm cách nào a Nam có thể giúp em nhé!Cám ơn a nhiều.
Các bạn ơi, các bạn chịu khó tìm giải pháp nhé, tôi chỉ có thể trả lời các câu hỏi liên quan trực tiếp đến nội dung bài viết🙂
Thanks
Em chào Anh Nam.
Em có một vấn đề mà theo em suy nghĩ như thế này không biết có đúng hay không.
Từ khóa ‘ var ‘ trong Linq nó là một kiểu dữ liệu tùy biến tùy theo từng trường hợp của câu truy vấn, như vậy có thể kết luận nó là một kiểu anonymous hay không.
Mong anh giải thích rõ giúp em và các bạn hiểu rõ hơn về từ khóa này.Thank!
@blackha123:Bạn biết lỗi chỗ đó nếu ko đc thì có thể chuyển sang kiểu dữ liệu khác chứ ko nên khư khư 1 kiểu. Bạn làm như trên có lẽ mất đi cái hay của Linq rồi. chỉ cần InsertOnSubmit
VD:
Tb_Khoas K=new Tb_Khoas();
K.tenkhoa=txttenkhoa.Text;
K.Sodienthoai=Sodienthoai.Text;
DataContext d=new DataContext();
d.Tb_Khoa.InsertOnSubmit(K);
@mẫn đạt: Bạn dùng vòng lặp for hoặc foreach để duyệt. Còn nếu cộng trên Gridview thì bạn nên duyệt từng dòng theo tên cột.
@SiNhat: Em xem bài viết này nhé https://namdh.wordpress.com/2011/04/26/var-keyword/
Thank Nguoicungkho so much!man dat da lam duoc roi!
Em chào A Nam
Anh có thể giúp em doạn code, e chưa hiểu ý nghĩa thật sự của nó lắm:
var query=from cust in Customer
select new{Name=cust.Name, City= cust.City}
Cám ơn Anh đã dành thời gian quan tâm.
var query=from cust in Customer
Nó tương đương với câu lệnh select * from customer trong sql server
select new{Name=cust.Name, City= cust.City}
Có nghĩa bạn lọc để lấy ra 2 column là Name, City và bạn đặt tên cho 2 column này sang tên khác (trong trường hợp của bạn đặt tên giống với trong DB).
Toàn bộ câu lệnh của bạn khi biên dịch ra sql sẽ là:
select Name as Name, City as City from Customer
Nếu bạn debug trong Visual thì bạn có thể dễ dàng thấy đc câu lệnh đc biên dịch như thế nào.
Tại sao ở phần 2) Cập nhật một sản phẩm trong CSDL viết bằng C# ta lại khai báo là Product product, trong khi những chỗ khác lại code: var product. Nếu ta đổi Product thành var thì có sao ko, khai báo Product và var khác nhau như thế nào? Mong mọi người giúp đỡ. Cám ơn😀
var query=from cust in Customer
select new{Name=cust.Name, City= cust.City}
Cảm ơn anh nhưng
Vấn đề của em là câu lệnh này Name=cust.Name
Để tạo một phần tử có chứa nhiều hơn một thuộc tính của các phần tử nguồn. Ta có thể sử dụng một đối tượng khởi tạo với một đối tượng có tên hoặc một kiểu giấu tên. Ví dụ sau đây cho thấy việc sử dụng kiểu giấu tên để đóng gói hai thuộc tính từ mỗi phần tử Customer.
@duy: Bạn xem lại bài https://namdh.wordpress.com/2011/04/26/var-keyword/ nhé
“Để tạo một phần tử có chứa nhiều hơn một thuộc tính của các phần tử nguồn. Ta có thể sử dụng một đối tượng khởi tạo với một đối tượng có tên hoặc một kiểu giấu tên. Ví dụ sau đây cho thấy việc sử dụng kiểu giấu tên để đóng gói hai thuộc tính từ mỗi phần tử Customer.” Có nghĩa là nếu em chỉ muốn trả về phần tử là một thuộc tính của cust thì chỉ trả về đúng thuộc tính đó:
var query=from cust in Customer
select cust.Name
Nhưng nếu muốn trả về nhiều hơn một thuộc tính thì có thể tạo kiểu vô danh như trên
Em cảm ơn Anh Nam đã dành thời gian giải đáp thắc mắc của em.
Em xin hỏi anh một chỗ này ma em cũng tìm tòi mà vẫn chưa có cách. Em chi áp dụng đươc theo lối cũ thôi.
Giả sử em có doan code truy vấn bằng Linq như sau:
DataClassQuanLySinhVienDataContext conn = new DataClassQuanLySinhVienDataContext();
var sinhvien = from s in conn.SINHVIENs
from l in conn.LOPs
from k in conn.KHOAs
where
(
((s.MALOP == l.MALOP) && (l.MAKHOA == k.MAKHOA) && (l.MALOP == malop))
)
orderby s.TENSV ascending
select new
{
MaSinhVien = s.MASV,
TenSinhVien = s.TENSV,
Phai = s.PHAI,
NgaySinh = s.NGAYSINH,
NoiSinh = s.NOISINH,
KhoaHoc = s.KHOAHOC,
TenLop = l.TENLOP,
TenKhoa = k.TENKHOA
};
Em muốn thực hiện đưa các thông tin này lên từng textbox ứng với mỗi thông tin.
Em chỉ suy nghĩ được phương pháp này thôi
SqlCommand cmd = (SqlCommand)conn.GetCommand(tenmh);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
Nhưng theo lối mô hình ADO.NET phiên bản trước đây.
Em cảm ơn anh và các bạn.
Anh Nam cho e hỏi là sử dụng LinQ thì có bị tấn công SQL Injection so với 1 số cách viết câu lệnh trực tiếp bằng SQL ko a ?
Không em ạ
@SiNhat: Anh không rõ em hỏi gì
@sinhat:
Nếu bạn làm Linq thì tốt nhất là nên bỏ qua 3-tiers cũ đi vì nó tự gen ra cho bạn rồi.
DataClassQuanLySinhVienDataContext conn = new DataClassQuanLySinhVienDataContext();
var sinhvien = (from s in conn.SINHVIENs
from l in conn.LOPs
from k in conn.KHOAs
where
(
((s.MALOP == l.MALOP) && (l.MAKHOA == k.MAKHOA) && (l.MALOP == malop))
)
orderby s.TENSV ascending
select new
{
MaSinhVien = s.MASV,
TenSinhVien = s.TENSV,
Phai = s.PHAI,
NgaySinh = s.NGAYSINH,
NoiSinh = s.NOISINH,
KhoaHoc = s.KHOAHOC,
TenLop = l.TENLOP,
TenKhoa = k.TENKHOA
}).Single();
txtMASV.Text=sinhvien.MaSinhVien;
….
bạn chỉ cần làm như trên thôi.
Thân
anh nam oi, anh co the giai thich cho em cai nay duoc khong ah, anh giai thich cho em cang de nho thi cang tot ah, em moi tim hieu ve linq thoi
p=>p.ProductName==”Chai”
Em xem bài sau nhé: https://namdh.wordpress.com/2009/07/22/lambda-expression/
Em chao Anh Nam
Em có một câu hỏi mà suy nghĩ mãi vẫn chưa ra.Đó là: Em thấy LINQ đa số đều làm được những gì mà SQL làm được. Vậy nhưng một số người vẫn cho rằng LINQ vẫn có cái chưa làm được mà SQL mới làm được.
Anh Nam hiểu rõ về LINQ. có thể chỉ giúp em chỗ này.
Cám ơn Anh Nam nhiều.
anh ơi cho em hỏi với
em có một thủ tục chèn vào bảng sinhvien(masv ,tensv) như sau
create proc themsv
@Masv varchar(10),
@Tensv nvarchar(50)
as
insert into sinhvien values(@Masv,@Tensv)
exec themsv ‘sv04′,’Hai anh’
và em dùng câu lệnh LinQ gọi thủ tục nay như sau
DataClasses1DataContext cl = new DataClasses1DataContext();
private void btnThem_Click(object sender, EventArgs e)
{
if (kiemtr(txtMasv.Text) == false)
{
cl.themsv(txtMasv.Text, txtTensv.Text);
}
else
{
MessageBox.Show(“Mã trùng”, “thông báo”);
}
anh cho em hỏi em gọi thủ tục bằng LinQ như vậy có đúng k ạ
Em chào anh
ai trả lời giúp em với em dang cần gấp cảm ơn mọi người
Chào anh, em thấy hình như mấy anh chị toàn toàn tạo database rồi mới tạo class, vậy giờ em có một class như sau: class employee là một interface và có 3Hourly_Employee, salary_employee, Consultant vậy thì khi mapping xuống csdl thì em phải khai báo trong lớp datacontext như thế nào để em giải quyết được trường hợp trên.
Thanks mọi người nhiều
Mình nghĩ phải thêm cái “var e =” đằng trước lời gọi Pro kia.
private void btnThem_Click(object sender, EventArgs e)
{
if (kiemtr(txtMasv.Text) == false)
{
var e = cl.themsv(txtMasv.Text, txtTensv.Text);
}
else
{
MessageBox.Show(“Mã trùng”, “thông báo”);
}
@Phạm Mới: Đọc qua thì thấy không có vấn đề gì. Nhưng sao bạn không chạy thử xem có được hay không, nếu không thì hỏi cũng được mà???
@Vũ Đức Toàn: Không cần var e = cũng được bạn ạ, đó chỉ là câu khai báo biến mà thôi, trong trường hợp này thêm vào thành thừa.
@Khách: Trường hợp này với LINQ to SQL em sẽ có 3 table tương ứng với 3 lớp.
Cũng có thể tạo 1 table cho employee và 3 table 3 lớp còn lại, nhưng trường hợp này hơi khó khăn vì LINQ to SQL chỉ cho phép map 1-1 với CSDL. Nếu dùng Entity Framework sẽ có nhiều lựa chọn hơn.
@nhân: Câu hỏi của em không dễ trả lời (vì sẽ tương đối dài). Vậy nên tôi xin kiếu lại và sẽ viết 1 bài đầy đủ về vấn đề này.
mà quên.còn phải cl..SubmitChanges(); nữa mới dc
private void btnThem_Click(object sender, EventArgs e)
{
if (kiemtr(txtMasv.Text) == false)
{
var e = cl.themsv(txtMasv.Text, txtTensv.Text);
cl..SubmitChanges();
}
else
{
MessageBox.Show(“Mã trùng”, “thông báo”);
}
cl.SubmitChanges();
gõ nhầm 2 dấu chấm.
OK Nam. Mình quen viết có var e đằng trước. Mình cũng nghĩ là không cần trong trường hợp này
anh nam ơi, cho em hỏi, em có đọc mấy câu trả lời của anh, em thấy có 1 câu a viết thế này: (Chú ý là LINQ to SQL chỉ được dùng với SQL Server)
vậy là sao anh, chẳng lẽ nó không dung được với mysql ah, em nghe nói tỉnh mở rộng của linq cao mà, sao mà LINQ to SQL chỉ được dùng với SQL Server, anh giải thích giúp em với
LINQ và LINQ to SQL là khác nhau mà, một cái có chữ “to SQL”, một cái không😀
Chào anh Nam!
Em đang làm một bài thực tập: Tìm hiểu Linq, Linq to SQL. Anh có thể cho em ít tài liệu về đề tài đuocjw không ạ. nếu được định hướng giúp em về đề tài được không ạ. Do đây là lần đầu em làm đề tài nên rất lúng túng, khó xác định được phương hướng.
Nếu được em xin cảm ơn anh trước!
Tài liệu thì em cứ vào tag LINQ to SQL thôi, còn đề tài thì em … tự nghĩ😀
Ai cho mình hỏi khi mình muốn update vào CSDL thì mình viết đoạn code sau đây nhưng cứ bị lỗi:
‘”DataClassesDataContext’ does not contain a definition for ‘pd_UpdateChiTietHH’ and no extension method ‘pd_UpdateChiTietHH’ accepting a first argument of type ‘DataClassesDataContext’ could be found (are you missing a using directive or an assembly reference?) ”
// Code C#
protected void Button1_Click(object sender, EventArgs e)
{
string ChiTietHang = Editor1.Content;
string TenHangNgan = tbTenHangNgan.Text;
string MH = tbMaHang.Text;
DataClassesDataContext Groupon = new DataClassesDataContext();
var Update = Groupon.pd_UpdateChiTietHH(ChiTietHang, TenHangNgan, MH);
Groupon.SubmitChanges();
}
// Còn store proc của nó đây
ALTER proc pd_UpdateChiTietHH
(@ChiTietHangHoa Nvarchar(MAX),
@TenHangNgan Nvarchar(50),
@MaHang Nvarchar(50)
)
AS
BEGIN
UPDATE HangHoa
SET ChiTietHH = @ChiTietHangHoa,
TenHangNgan = @TenHangNgan
WHERE MaHang = @MaHang
END;
Trong context của em đã có thủ tục đó hay chưa? (em đã kéo – thả thủ tục của em vào trong cửa sổ design chưa?)
Bạn Nam cho mình hỏi code để kết nối trực tiếp với datadase dùng LINQ với. Vì khi triển khai phần mềm nếu dùng LINQ to SQL bằng design thì các máy khác không truy cập được. Bạn có tài liệu về LINQ to SQL bằng Code thì cho mình xin nhé. Cám ơn bạn
Bạn xem bài Hỏi đáp LINQ (https://namdh.wordpress.com/2008/12/08/linq-faq/), tìm câu hỏi của bạn huongtk3 nhé
chào anh Nam!
cho em hỏi tại sao em tạo liên kết tong linq to sql không được vậy anh,
em cài C# 2008 và sql sever 2005 rồi mà.
hương: Thật khó để trả lời vì quá ít thông tin.
Anh cho em hỏi tí với!
đoạn code của em như vậy mà sao nó cứ báo lỗi chỗ ” ct.GiayChungNhans.DeleteOnSubmit(nsd);” vậy anh. Trong bài của anh có nói “RemoveAll” đã được thay đổi bằng “DeleteAllOnSubmit” mà sao trong C# 2008 không có “RemoveAll”.
private void Form6_Load(object sender, EventArgs e)
{
DataClasses3DataContext ct = new DataClasses3DataContext();
IEnumerable nsd = from c in ct.GiayChungNhans where c.SoGCN.Contains(“G1”) select c;
ct.GiayChungNhans.DeleteOnSubmit(nsd);
ct.SubmitChanges();
}
private void Form5_Load(object sender, EventArgs e)
{
NguoiSuDung nsd = new NguoiSuDung();
nsd.SoCMNDNSD = “205411876”;
nsd.NgayCap1 = DateTime.Parse(“10/12/2002 21:12:10”);
nsd.NoiCap1 = “CA Quảng Nam”;
nsd.TenNSD = “Phạm Thị Hiệu”;
nsd.NamSinh1 = 1987;
nsd.DiaChi1 = “Thăng Bình – Quảng Nam”;
nsd.SoDienThoai1 = “0987654357”;
DataClasses3DataContext ct = new DataClasses3DataContext();
ct.NguoiSuDungs.InsertOnSubmit(nsd);
ct.SubmitChanges();
}
cho em hỏi luôn đoạn này với.
sao đoạn này không báo lỗi mà khi chạy không hiển thị kết quả vậy anh.
Em cảm ơn anh trước!
Hi anh Nam ! Cho em hỏi chút xíu về tìm kiếm unicode trong linq với.
Em đang làm chức năng tìm kiếm trực tiếp trong Linq nhưng vấn đề lỗi ở chuỗi tìm kiếm và kết quả.
Từ khóa tìm kiếm của em là “lap trinh”, dữ liệu là chuỗi “kĩ thuật lập trình bằng Linq”
Kết quả sẽ trả về null. Hiện tại em đang dùng câu lệnh contains để so sánh.
Vậy có cách nào để compare trực tiếp trong Linq ko anh ?
Em search thấy có 1 cách mà chuối quá:
1. Convert chuỗi tìm kiếm về dạng chuỗi không dấu và chữ viết thường.
2. Convert dữ liệu tại trường để so sánh trong database về dạng chuỗi không dấu và chữ viết thường.
3. So sánh 2 chuỗi dữ liệu vừa convert và đưa ra kết quả.
Với cách này thì không thế áp dụng nếu số lượng records nhiều.
Việc tìm kiếm theo cách “mềm dẻo” như vậy thì thường không thể dùng LIKE hay Contains trong LINQ. Các hệ CSDL hỗ trợ việc này thông qua FULL TEXT SEARCH, mỗi hệ quản trị CSDL lại có cách dùng FULL TEXT SEARCH khác nhau nên nếu muốn tìm hiểu cái nào thì em tìm tài liệu cái đó đọc nhé.
Ok! Thanks anh.
Chắc em kết hợp Skip, Take của Linq và SP của Sql Server thôi.
Anh Nam cho em hỏi tí….
Em có 1 CSDL bán hoa..trong đó có 1 bảng là User..Trong User có 1 trường là trạng thái (kiểu bit) “True/False”..(True là còn hoạt động,còn False là user đó hết hoạt động),Làm sao để load những User nào còn hoạt động(Trạng thái = “True”) lên table và khi em ấn nút xóa thì User đó vẫn còn trong hệ thống nhưng chuyển từ Trạng thái == “True” sang Trạng thái == “False”…Em ko bik sai chỗ nào…Mong anh zúp zùm e..e sắp nộp bài oài…
public ActionResult Display()
{
USER b = db.USERs.Single(p => p.TenDangNhap == “zipper”);
return View(b.ToList());
}
[HttpPost]
public ActionResult Delete()
{
USER tam = db.USERs.Single(p => p.TrangThai == true);
tam.TrangThai == false;
db.SubmitChanges();
return RedirectToAction(“Display”);
}
}
}
Cám ơn anh và chúc anh sức khỏe…n
Em load dữ liệu USER = True lên được rùi…e chỉ thắc mắc là sao e ko update những USER từ True –> False (Ấn nút xóa trên form quản lý)..E ko bik bị lỗi zì,a zúp zùm e vấn đề này với…thank a
Lớp ShopHoaOnlineDataContext :
public ShopHoaOnlineDataContext sodc;
public List user()
{
List us = USERs.Where(u => u.TrangThai == true).ToList();
return us;
}
public List sua()
{
var c = from p in sodc.USERs
select p;
foreach (var item in c)
{
item.TrangThai = false;
}
sodc.SubmitChanges();
}
Lớp USERController : Controller
public class KhuyenmaiController : Controller
{
USER d;
//
// GET: /Khuyenmai/
private ShopHoaOnlineDataContext sodc = new ShopHoaOnlineDataContext();
public ActionResult Index()
{
return View();
}
public ActionResult Display()
{
return View(“Display”,sodc.user());
}
[HttpPost]
public ActionResult update()
{
return View(“Display”,sodc.sua());
}
}
Anh đọc code của em mà hoa hết cả mắt *_*
public List sua() sao không thấy return? Nếu không có gì return sao lại trả về List?
Em có 2 cái sodc có kiểu ShopHoaOnlineDataContext, anh không biết dùng như thế nào.
Dạ.code đó của thèn bạn e nó làm.a có thể cho e bik mail của a đc ko..e gửi project qua . E cũng mới học LinQ nên ko bik lỗi ở đâu.Gần đến hạn nộp mà e bí quá.Mong a zúp zùm em.
hello hú hú
var query = from c in dt.DichVuPhongThues
join d in dt.ChiTietDVPhongs
on c.MaDVPhongThue equals d.MaDVPhongThue
group d by d.MaDVPhongThue into dgroup
where dgroup.Key == txtmadv.Text
select new
{
TongTien = dgroup.Sum(groupItem => groupItem.ThanhTien)
};
txttongtien.Text = (query.Sum(o=>o.TongTien)).ToString();
………………………………………………
em co doan code tren nho a kiem tra dum la tai sao e khong tinh duoc tong tien de gan vao textbox txttongtien.text a!
……………………………..
var query = from n in dt.ChiTietDichVus
where n.MaChiTietDV == cbchitietdv.Text
select n.Gia;
int tt = Convert.ToInt32(query.SingleOrDefault(o => o.Value > 0));
int t;
t= tt * Convert.ToInt32(txtsolan.Text);//dong bao loi
txtthanhtien.Text = t.ToString();
…………………………..
con doan code thu 2 thi khi luc insert them mot dong du lieu vao bang chitietdichvu thi lai bao loi o dong tren la input string was not correct format, trong khi e da chuyen sang kieu chuoi het roi a!
….
Som nhan duoc phan hoi cua a.
Anh Nam cho Em hỏi . . . hiện tại E với 1 người bạn làm chung 1 đồ án. Em thì sử dụng LinQ to SQL bạn E thì sư dụng ADO.Net lí do vì 2 đứa kiến thức không tương đồng đó A. lúc làm thì 2 đứa làm riêng.nhưng khi gộp lại thì gặp rắc rối. khi em copy và include file dbml vô project của bạn E thì nó báo code của bạn E bị lỗi không built được (exclude file dbml thi project của bạn E hoạt động bình thường) => A cho E hỏi có cách nào gộp 2 bài của tụi e lại làm 1 được không dậy A?
Không build được vì lỗi gì hả em? Có lẽ do project của bạn em chạy trên .NET 2.0, còn của em là 4.0, nếu vì lý do đó thì em phải chỉnh lại project của bạn em thành 4.0 rồi mới thêm vào được.
Anh Nam ơi
em dùng LINQ load 2 table trên database xuống thì nó không thể edit được các cột. ví dụ như cột string thì không thể thêm chữ, checkbox thì không tích chọn được… dù em để Edittable = true
Làm thế nào để em load 2 table dùng select new { 1 số cột cần lấy trong 2 table } mà có thể edit trực tiếp trên gridcontrol hay datagridview hả anh
Pingback: Cập nhật cơ sở dữ liệu (LINQ to SQL phần 4) - An Le's Blog
Bạn cho mình hỏi trong LinQ mình muốn SELECT TOP 10 của sản phẩm thì làm sao vậy?
Anh ơi Anh có thể giúp em chỗ này với ạ. Em muốn thêm vào table nhiều row một lúc. Khi em thêm lần lượt các phần tử của mảng. Nhưng code bên dưới chỉ thêm được một hàng rồi báo lỗi. em làm mãi ko được. Mong em giúp đỡ em.Thanks a nhiều
KetNoiCSDLDataContext dt = new KetNoiCSDLDataContext();
Email mail = new Email();
string myString = “phuong;hoa;thu;thinh;long”;
char[] separator = new char[] { ‘;’ };
string[] colorList = myString.Split(separator);
for (int i=0; i < colorList.Length;i++ )
{
mail.Title = txttieude.Text;
mail.UserReceipt = colorList[i];
mail.Content = txtnoidung.Text;
dt.Emails.InsertOnSubmit(mail);
dt.SubmitChanges();
}
A ơi Giúp em đi ạ
Anh namdh ơi. Em có 1 chút vấn đề cần a góp ý ạ.
Em đang tập viết Linq Với mô hình 3 lớp. Trong Lop controller em có phương thức kiểm tra login như sau
public bool checkLogin(string name. string pasword)
{
DataDataContext data = new DataDataContext();
var x = from y in data.TBL_Users
where y.UserID == name && y.Password == password
select y;
foreach (var item in x)
{
if (item.isAdmin.Value)
{
IsAdmin = item.isAdmin.Value;
}
else
{
IsAdmin = item.isAdmin.Value;
}
}
return IsAdmin;
}
và trong trang interface em co thiết kế 1 web form Login. với 2 control txtUser và txtPassword.
Khi Nhấn submit Button thì gọi cái phương thức checkLogin của lớp Controller để kiểm tra. Nếu là Admin thì chuyển sang trang addnew.aspx Nếu là User thì chuyển sang trang Details.apsx. Còn nếu sai thì chuyển về sang Login.aspx.
Code :
Class1 classdata = new Class1();
protected void Button1_Click(object sender, EventArgs e)
{
if (classdata.checkLogin(txtUserName.Text, txtPassword.Text))
{
if (classdata.IsAdmin)
{
Response.Redirect(“AddNew.aspx”);
}
else
{
Response.Redirect(“Details.aspx”);
}
}
else
{
Response.Redirect(“Login.aspx”);
}
}
Khi login là user thì lại không chuyển đến trang Details.aspx mà lại chuyển đến trang Login.aspx. Còn đăng nhập Admin thì thành công. Mong anh giúp em với. Đang bị rối chỗ này. Cảm ơn a nhiều.
dạ bổ sung thêm là IsAdmin là một propety kiểu bool và isAdmin là một cột trong table TBL_Users có value la bit(True/False). Mong a giúp em với
Nguyên nhân là hàm của em hơi lộn xộn, 1 hàm làm cả 2 việc là vừa kiểm tra xem có phải là user đã đăng ký hay không, lại vừa kiểm tra có phải là admin hay không nên kết quả trả về bị sai.
Anh sửa lại 1 chút nhé:
public bool checkLogin(string name. string pasword)
{
bool success = false;
DataDataContext data = new DataDataContext();
var x = from y in data.TBL_Users
where y.UserID == name && y.Password == password
select y;
foreach (var item in x)
{
IsAdmin = item.isAdmin.Value;
success = true;
}
return success;
}
Dạ anh namdh ơi, em đã tìm ra nguyên nhân. Nguyên nhân chính là cai hàm CheckLogin. Ở code của em trả về giá trị true/false. Đằng này em chỉ gán giá trị cho IsAdmin.nhưng chưa return true or false. Và khi Client login thì ham CheckLogin chỉ kiểm tra được là Admin, còn user thì không kiểm tra. nhờ code của a e đã tìm ra lỗi của mình. Em sữa lại như sau và nó đã chạy được. Cảm ơn anh rất nhiều:
đây là đoạn code của em:
public bool LoadData(string name, string password)
{
DataDataContext data = new DataDataContext();
var x = from y in data.TBL_Users
where y.UserID == name && y.Password == password
select y;
foreach (var item in x)
{
if (item.isAdmin.Value)
{
IsAdmin = item.isAdmin.Value;
}
else
{
IsAdmin = item.isAdmin.Value;
}
return true;
}
return false;
}
Một lần nữa em cảm on anh nhiều lắm. Em đang mày mò về LinQ. Có gì sai sót mong a giúp đỡ cho. Thân gởi
chào anh, em đang tự tìm hiểu về Linq, khi tạo file Linq to SQL thì nó sẽ tự tạo ra file app.config, e muốn làm 1 form cấu hình khi mang đi máy khác có tên server, id, pass của sql không giống máy mình thì làm thế nào ạ. mong anh giúp đỡ
Bạn xem bài Hỏi đáp LINQ (https://namdh.wordpress.com/2008/12/08/linq-faq/), phần trả lời cho câu hỏi của bạn huongtk3 nhé
bạn ơi minhg muốn xin tài liệu linq to sql với ví dụ demo, mong bạn giúp đỡ, xin cảm ơn
mình muốn tăng số lượng đọc bài lên thì làm sao!
table baiviet(
idbaiviet int,
soluongdoc int)
cảm ơn!

X-ac: 1.dca _dca

X-hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.

Link: <http://wp.me/pgR1Z-5N>; rel=shortlink

Vary: Cookie