0

私はそれを解決する方法がわかりません。基本的に、「Shifthours」というテーブルと「employeeshift」というテーブルがあります。Shifthours テーブルには、shift_Start と shift_Stop があります。employeeshift テーブルには StartTime と EndTime があります。shift_Start と StartTime を比較しています。外部キーを使用してこの 2 つのテーブルをリンクしました。私が尋ねた質問は、shift_Start を StartTime と比較し、shift_Stop を EndTime と比較して、従業員がどのシフトに適合するかを確認し、shift_Start と shift_Stop が列に表示されることです。従業員が適格であること。

現在、2つのテーブルを結合するだけでタイミングを比較しないコードを取得しました。

private void LoadAllEmpShift()
    {
        using (testEntities Setupctx = new testEntities())
        {
            BindingSource BS = new BindingSource();
            var Viewemp = from ES in Setupctx.employeeshifts
                          join shifthour sh in Setupctx.shifthours on ES.ShiftHourID equals sh.idShiftHours
                         select new
                         {
                             ES.EmployeeShiftID,
                             ShiftHour_Start = sh.shiftTiming_start,
                             ShiftHour_Stop = sh.shiftTiming_stop,
                             ES.EmployeeName,
                             ES.StartTime,
                             ES.EndTime,
                             ES.Date
                         };


            BS.DataSource = Viewemp;
            dgvShift.DataSource = BS;
        }
    }

誰でもこれを行う方法を知っていますか?

4

1 に答える 1

0

編集:

あなたは、従業員の時間が一連のシフト時間と一致する場所を見つけようとしていると言いました。良いシフト時間の一致を決定するために使用したいサンプルデータとアルゴリズムがあると便利です。

ここでは、そのための最善の方法は、従業員の開始時間を最も近いシフト開始時間に基づいて決定することであると想定しました。

次のコードでは、このlet関数を使用して、基本的にシフト時間を調べ、従業員の開始時間に最も近いシフト時間のセットを見つけます。

var Viewemp = from ES in Setupctx.employeeshifts
      join sh in Setupctx.shifthours on ES.ShiftHourID equals sh.idShiftHours 
         into shifts
      let diff = shifts
          .OrderBy (s => 
                    // this is the line that needs attention:
                    System.Math.Abs((int)(ES.StartTime - s.shiftTiming_start))
                   )
                   .First ()
      select new
      {
          ES.EmployeeShiftID,
          ShiftHour_Start = diff.shiftTiming_start,
          ShiftHour_Stop = diff.shiftTiming_stop,
          ES.EmployeeName,
          ES.StartTime,
          ES.EndTime,
          ES.Date
      };

アップデート

StartTimeとEndTimeのデータベースのタイプは、時間ではなく文字列です

上記のコードでは、重要なロジックはとの間の絶対値の差を見つけることES.StartTimes.shiftTiming_startあり、最小の差はシフト時間の最適な一致を示します。残念ながら、データベースにはこのデータが文字列として格納されているため、数値として比較する必要があります。

stringLinq-to-Entitiesには、関数に変換する簡単な方法が含まれていませんint

string次のステップは、これらの値を値に変換する方法を調べることだと思いますint。私はそれがあなたを助けるかもしれないと思うので、この質問を見てください:

EF4.0で文字列をIntに変換する

于 2012-07-19T02:23:56.993 に答える