2016-05-03 8 views
0

年齢を検索していますが、私の問題を解決できませんでした。 私は本当の初心者なので、私はEFについてあまり知らないので、私は非常に多くの解決策を試しましたが、正しい道を得ることができませんでした。EntityFrameworkでNativeQueryの複数のテーブルを使用

私はEntityFramework6で作業しています。 、

  • 従業員(社員、BadgeNumber、姓、姓、...)
  • シフト(ShiftId、たstartDate、endDateに、ShiftTypeId)
  • TypeShift(TypeShiftId、説明、startHour: は、私は4つのテーブルを持っていますendHour)
  • カチカチ(TickId、TickingDate)

私は期間ともdislpay従業員と「カチカチ日付」の関連するシフト内のすべてのTickingsをリストする必要があります。従業員とシフトの関係は、多対多関係です。 DBで生成されたブリッジテーブルは 'EmployeeShift'

最初はLINQでやってみましたが、失敗しました。 とIネイティブSQLクエリをwirtingになってしまった(クエリがテストされ、それが働いている)ウィッヒは次のとおりです。

public List<Object> getTickings(DateTime fromDate, DateTime toDate) 
{ 
    try 
    { 

     var tickingList= model.Database 
     .SqlQuery<Object>("select distinct Employees.numBadge, Employees.EmployeeId, Employees.firstName, Employees.lastName, Tickings.TickingId, Tickings.tickingDate, TypeShifts.description, Shifts.startDate, Shifts.endDate, TypeShifts.startHour, TypeShifts.endHour 
    from Tickings, Employees, Shifts, TypeShifts, EmployeeShift 
    where Employees.EmployeeId= Tickings.EmployeeId 
    and Tickings.TickingDate <= '" + toDate+ "' 
    and Tickings.TickingDate >= '" + fromDate+ "' 
    and Employees.EmployeeId= EmployeeShift.employees_EmployeeId 
    and EmployeeShift.shifts_ShiftId = shifts_ShiftId 
    and Tickings.TickingDate <= Shifts.endDate 
    and Tickings.TickingDate >= Shifts.startDate").ToList<Object>(); 

     return tickingList; 
} 
catch 
{ 
    return null; 
} 
} 

は今、私は複数のテーブルを持っているので、異なるオブジェクト。 'List'の代わりに 'List'を追加すると、返されるリストはnullではなく、リストにアクセスできません。私は何かが欠けていると確信しています。 質問は次のとおりです。ネイティブクエリで動作させるにはどうすればよいですか?またはLINQ

ありがとうございました。それは有り難いです。

よろしくお願いいたします。

+1

SELECT Employees.numBadge、Employees.EmployeeId、Employees.firstName、Employees.lastName、Tickings.TickingId、Tickings.tickingDate、TypeShifts.description、Shifts.startDate、Shiftsの列に対応するプロパティを持つ 'MyResult'クラスを作成します。 .endDate、TypeShifts.startHour、TypeShifts.endHour Tickings、Employees、Shifts、TypeShifts、EmployeeShift'このクラスを使用する.SqlQuery '... – Serg

+0

回答ありがとう – Ghita

答えて

1

まず、クエリでカンマ区切りのテーブル名を使用してレコードを取得する代わりに、SQL JOINSを使用することをお勧めします。いずれにしても、適切な結果が得られたら、私は気にしません。

SQLビューを作成すると、そのビューの列を使用してプロパティを持つクラスが生成されます。この方法は、あなたのクエリは、はるかに簡単になり、あなたはインラインクエリにクリーン&きちんとLINQの構文を使用して、代わりに書いて、それをアクセスすることができます今

List<vTickings> tickings = db.vTickings.Where(vt=> vt.TickingDate<=toDate && vt.TickingDate >= fromDate).ToList(); 
よう要求したレコードを取得するために、単純なLINQを使用して

CREATE VIEW [dbo].[vTickings] 
AS 

select distinct Employees.numBadge, Employees.EmployeeId, Employees.firstName, Employees.lastName, Tickings.TickingId, Tickings.tickingDate, TypeShifts.description, Shifts.startDate, Shifts.endDate, TypeShifts.startHour, TypeShifts.endHour 
    from Tickings, Employees, Shifts, TypeShifts, EmployeeShift 
    where Employees.EmployeeId= Tickings.EmployeeId 
    and Employees.EmployeeId= EmployeeShift.employees_EmployeeId 
    and EmployeeShift.shifts_ShiftId = shifts_ShiftId 
    and Tickings.TickingDate <= Shifts.endDate 
    and Tickings.TickingDate >= Shifts.startDate 

END 

エンティティフレームワークのdbContextにアクセスするdbという変数があるとします。

+0

ありがとうございました。それはフィードバックを与える – Ghita

+0

それは完全に働いた、もう一度ありがとう。私はsql joinを使用しました。ベストプラクティス:D – Ghita

関連する問題