web-dev-qa-db-ja.com

LINQを使用してWHERE NOT EXISTを選択する方法は?

shift」データをすべてリストして、「employee」が、従業員のデータに既に存在する場合、シフトデータを含めないでください。画像サンプルを見てみましょう。

No filtering yet

このクエリは問題を解決します。私はこれをここで見つけました:
スコットのブログ

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

結果を見てみましょう:

Filtered

さて、私の質問は、linQでこれをどのように作成できますか?エンティティフレームワークを使用しています。
誰かが助けてくれることを願っています。どうもありがとう!!!

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

お役に立てれば

83
Arsen Mkrtchyan

結果のsqlは異なりますが、結果は同じである必要があります。

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

まず、SQLクエリを少し変更することをお勧めします。

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

このクエリは同じ機能を提供します。 LINQで同じ結果を取得する場合は、次のコードを試すことができます。

//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();
2
Ceridan