2012-01-27 28 views
40

Tôi phải liệt kê tất cả "shift" dữ liệu được chỉ định cho "nhân viên" nhưng dữ liệu thay đổi không được bao gồm nếu dữ liệu đó đã có sẵn trong dữ liệu của nhân viên. Hãy xem mẫu hình ảnh.Làm thế nào để CHỌN KHÔNG NÊN sử dụng LINQ?

No filtering yet

Truy vấn này giải quyết được sự cố. Tôi thấy điều này ở đây:
Scott's Blog

select * from shift where not exists 
(select 1 from employeeshift where shift.shiftid = employeeshift.shiftid 
and employeeshift.empid = 57); 

Hãy xem kết quả:

Filtered

Bây giờ câu hỏi của tôi là, làm thế nào tôi có thể làm điều này trong LINQ? Tôi đang sử dụng khung thực thể.
Hy vọng ai đó có thể giúp đỡ. Cảm ơn rất nhiều!!!

+1

bạn có thể chỉ cần làm một tham gia ... nếu kỷ lục đúng không tồn tại, kỷ lục trái nên không được bao gồm –

+0

@AndreasNiedermair Bạn có thể làm một số ví dụ không? Tôi đã làm rất nhiều việc tham gia nhưng tôi đã không nhận được một trong những quyền. – fiberOptics

+0

bản sao có thể có của [LINQ - Nơi không tồn tại] (http://stackoverflow.com/questions/899090/linq-where-not-exists) –

Trả lời

70
from s in context.shift 
where !context.employeeshift.Any(es=>(es.shiftid==s.shiftid)&&(es.empid==57)) 
select s; 

Hope this helps

+0

oops, yea, cố định, nhờ @RuneFS –

+0

"&& es.empid = 57" phải nằm trong "(es.shiftid == s.shiftid)". nó hoạt động nhưng nó không trả về dữ liệu hoàn chỉnh, một số dữ liệu bị thiếu. – fiberOptics

21

Các sql kết quả sẽ khác nhau nhưng kết quả sẽ là như nhau:

var shifts = Shifts.Where(s => !EmployeeShifts.Where(es => es.ShiftID == s.ShiftID).Any()); 
+4

Bạn nên luôn sử dụng 'Any()' thay vì 'Count()' để xác định xem có _are_ kết quả ... – Nuffin

+4

bạn nên sử dụng! .Any() thay vì đếm. Nếu không có hiệu suất nào giống nhau nhưng trong mọi trường hợp có nhiều hơn 1 phần tử sẽ nhanh hơn vì nó dừng lặp lại sau khi phần tử đầu tiên được tìm thấy –

+0

Đủ công bằng, được chỉnh sửa. – hyp

0

Làm thế nào về ..

var result = (from s in context.Shift join es in employeeshift on s.shiftid equals es.shiftid where es.empid == 57 select s) 

Chỉnh sửa: Điều này sẽ cung cấp cho bạn sự thay đổi nơi có một employe liên quan (vì sự tham gia). Đối với "không tồn tại" Tôi muốn làm những gì @ArsenMkrt hoặc @hyp đề nghị

+0

Bạn bị mất empid = 57 kiểm tra –

+0

Yup, cộng với tôi nhận ra tôi không actaully trả lời đúng câu hỏi! –

+0

yea, bởi vì kết quả nên được kết quả thiết lập, bạn đang nhận được giá trị bool –

2

Trước hết, tôi đề nghị để sửa đổi một chút truy vấn sql của bạn:

select * from shift 
where shift.shiftid not in (select employeeshift.shiftid from employeeshift 
          where employeeshift.empid = 57); 

truy vấn này cung cấp nhiều chức năng giống. Nếu bạn muốn để có được kết quả tương tự với LINQ, bạn có thể thử mã này:

//Variable dc has DataContext type here 
//Here we get list of ShiftIDs from employeeshift table 
List<int> empShiftIds = dc.employeeshift.Where(p => p.EmpID = 57).Select(s => s.ShiftID).ToList(); 

//Here we get the list of our shifts 
List<shift> shifts = dc.shift.Where(p => !empShiftIds.Contains(p.ShiftId)).ToList(); 
+0

Bạn sql truy vấn hoạt động hoàn hảo. Nhưng trong LINQ, tôi ổn với truy vấn đơn lẻ. Cảm ơn! – fiberOptics

-1
 Dim result2 = From s In mySession.Query(Of CSucursal)() 
         Where (From c In mySession.Query(Of CCiudad)() 
          From cs In mySession.Query(Of CCiudadSucursal)() 
          Where cs.id_ciudad Is c 
          Where cs.id_sucursal Is s 
          Where c.id = IdCiudad 
          Where s.accion <> "E" AndAlso s.accion <> Nothing 
          Where cs.accion <> "E" AndAlso cs.accion <> Nothing 
          Select c.descripcion).Single() Is Nothing 
         Where s.accion <> "E" AndAlso s.accion <> Nothing 
         Select s.id, s.Descripcion 
+1

Hãy làm rõ những gì bạn đang làm với mã này. –

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