2012-01-11 11 views
0

実行しようとしているクエリがありますが、希望の結果が得られません。Nhibernate基準またはNhibernate Linqでクエリに参加します

select * from employee_login e 
left join employee_attendance ea on 
e.emp_id = ea.EmpId and dated = '2012-01-11' 

私はNHibernateはしてみましたLINQクエリは、VaRの出席resultviewで

var attendance = from emp in session.Query<Employee>() 
           join empatten in session.Query<EmployeeAttendance>() 
           on emp.emp_id equals empatten.EmpId into atts 
           from ur in atts.DefaultIfEmpty()          
           select new { ur }; 

です。どのようにこれらの2つのことを達成できますか?

  1. 左ジョイン結果の上に参加しないで従業員とemployeeattendance(従業員が左テーブルである)
  2. 条件にわたって加わります。

私はLinqまたは分離基準を使用してこの状況にかなり慣れています。分離された基準が好ましい答えになるだろう。ここで

はモデルです:

public class EmployeeAttendance 
{ 
    public virtual string No_ { get; set; } 
    public virtual Employee Employee { get; set; }  
} 
public class Employee 
{  
    public virtual string emp_id { get; set; } 
    public virtual ISet<EmployeeAttendance> Attendances { get; set; } 
    public Employee() 
    { 
     Attendances = new HashedSet<EmployeeAttendance>(); 
    } 
} 

マッピングは次のとおりです。

public class EmployeeAttendanceMap:ClassMap<EmployeeAttendance> 
{ 
    public EmployeeAttendanceMap() 
    { 
     Table("Employee_Attendance"); 
     Id(x => x.No_).GeneratedBy.Assigned();   
     References(x => x.Employee).Column("emp_id"); 
    } 
} 
public class EmployeeMap : ClassMap<Employee> 
{ 
    public EmployeeMap() 
    { 
     Table("employee_login"); 
     Id(x => x.emp_id).Column("emp_id").GeneratedBy.Assigned();   

     HasMany(x => x.Attendances).KeyColumn("No_").Cascade.All();   
    } 
} 

従業員がプライマリ・テーブルで、AttendanceLeaveは、従業員表から

編集をEMPIDなどの外部キーがあります。私も最後の試行でこれを試しました:

ICriteria criteria = session.CreateCriteria(typeof(Employee), "emp") 
        .CreateAlias("EmployeeAttendance", "Attendance", CriteriaSpecification.LeftJoin 
        , Restrictions.Eq("Attendance.Dated", DateTime.Parse("2012-1-11"))); 
私のようにエラーになってしまっ

しかし:

は、プロパティを解決できませんでした:のEmployeeAttendance:あなたが休暇中の従業員を取得したいようRoyal.Data.Core.Domain.Employee

+0

'select * from employee_login e left join employee_attendance ea on e.emp_id = ea.EmpIdとea。日付= '2012-01-11'' は '電子 をemployee_loginから*選択と同等でなければなりません e.emp_id = ea.EmpId どこea.dated =上employee_attendanceのEAに参加' 左2012-01-11 ''。あなたのモデルにEmployeeクラスとEmployeeAttendanceの間に関連がありますか? – Firo

+0

@Firo申し訳ありません、私はドメインを入れるのを忘れていました。はい、EmpIdが外部キーであるモデルにEmployee ClassとEmployeeAttendanceの間の関連があります – Joy

答えて

1

は、それは見えます特定の日付の時点で。あなたはまだ、各従業員の葉の完全なセットを取得しますが、それはあなたが望む従業員でなければなりません

var detached = DetachedCriteria.For<AttendanceLeave>("al") 
    .Add(Expression.Between('2012-01-11', "LeaveFrom", "LeaveTo")) //this should be a DateTime 
    .Add(Restrictions.EqProperty ("al.EmpId", "e.emp_id")) //make sure to use "e" for employee criteria alias 
    .SetProjection (Projections.Count ("al.EmpId")); 

var employeesOnLeave = session.CreateCriteria<Employee>("e") 
    .Add(Restrictions.Gt(Projections.Subquery(detached), 0)) 
    .List(); 

:前に私はこのように表現の間で使用されたことがありませんけれども、私は、これが働くだろうと思います。

更新 - あなたのコメントを見て、このようなものは、あなたが後にしているどのような可能性がありそうです:

DateTime dateInQuestion = new DateTime(2012, 1, 11); 

var employeesOnLeaveAsOfDateInQuestion = 
       session.CreateCriteria<Employee>("e") 
        .CreateCriteria("e.Attendances", "ea" 
         , NHibernate.SqlCommand.JoinType.LeftOuterJoin 
         , Restrictions.Between(dateInQuestion, "ea.LeaveFrom", "ea.LeaveTo")) 
        .List<Employee>(); 

これは動作するようです - しかし、あなたは、あなたが戻って取得するエンティティであることを確認する必要がありますキャッシュされていない場合は、キャッシュされたコピーが全コレクションとともに返されます。 Thisは私がテストしたものです - あなたの状況はコレクションのリンクテーブルを通して維持されているので正確にはそうではありませんが、どちらも同じように動作すると思います - 特にEvictCollectionメソッドはセッションではなくセッションファクトリで検出されます)。あなたはテストのためだけにこのビットが必要です(私のテストでは、データベースはセッションの間存続します)。このように解決したい場合は、要点にQueryOverの例もあります。

+0

あなたはシナリオをかなり持っています。事は私が従業員の出席に従事し、彼らの地位を得るために残っている理由は、すべての従業員thatsを取得したいです。その場合、右のテーブルに出席者がいなくても、特定の日付に従業員を戻しますが、その特定の日に出席者がいなければ出席者フィールドにはnullを返す必要があります。 – Joy

+0

http://stackoverflow.com/questions/2756148/nhibernate-left-outer-joinこのリンクは、私がしたいと正確に一致しています.heは解決策を与えましたが、私はそれを動作させる方法を得ていません。私はそれを実行する方法を意味します。私を助けてもらえますか? – Joy

+0

ちょうど私が掲示した更新をチェックしなさい、私はそれがあなたが望むことをすると思う - ちょうど言及されたキャッシュの問題に注意してください。 – AlexCuse