2015-01-29 13 views
6

Điều này sẽ trông như thế nào trong SQL (SQL Server nếu bạn muốn cụ thể)?SQL tương đương với LINQ .All()

// where people is a list of Person objects with property Name 
bool bobs = people.All(p => p.Name == "Bob"); 
+0

Toán tử '.All()' làm gì? –

+0

Tại sao bạn lại muốn bob? – Zane

+0

@ypercube: Nó trả về true nếu điều kiện là đúng cho tất cả các mục. – Guffa

Trả lời

5

Bạn sẽ kiểm tra nếu có bất kỳ hồ sơ mà không phù hợp với các tiêu chí:

not exists(select * from Persons where not Name = 'Bob') 

Như các quy tắc để so sánh để null khác nhau giữa C# và SQL, bạn sẽ cần một điều kiện để giá trị null nếu trường cho phép chúng:

not exists(select * from Persons where Name <> 'Bob' or Name is null) 
+5

Bạn có thể nói lại điều đó để nó không làm tổn thương não tôi đọc nó? Có thể 'Tên Tên <> 'Bob'' – Zane

+2

Đồng ý,' Tên <>' Bob'' trực quan hơn nhiều so với 'không Tên = 'Bob''. –

+1

@Zane: Tôi đã viết nó như thế để làm cho điều kiện có thể nhận ra được từ mã ban đầu và để tránh mọi trường hợp có thể xảy ra. Đương nhiên bạn có thể sử dụng toán tử '<>' nếu bạn biết kết quả là như nhau. – Guffa

3

Tôi không chắc chắn truy vấn chính xác LINQ sẽ tạo nhưng tương đương trong SQL là ALL op erator:

'Bob' = ALL (SELECT name FROM people) 
+0

Trong trường hợp này nó giống nhau, nhưng toán tử 'all' của SQL không tương đương với phương thức' All'. Ví dụ bằng cách sử dụng một điều kiện như '.All (p => p.name == p.nick)' không dễ dàng dịch sang sử dụng toán tử 'all'. – Guffa

+0

@Guffa. thật. Và bản dịch 'ALL' của tôi sẽ cho kết quả khác với' NOT EXISTS' nếu 'name' có giá trị null. Nếu bạn chắc chắn rằng LINQ dịch 'All()' thành không tồn tại, tôi nên xóa câu trả lời của mình. –

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