C# 数据库调用太多-NHibernate

C# 数据库调用太多-NHibernate,c#,sql,nhibernate,C#,Sql,Nhibernate,我有一个方法,通过循环记录并对每条记录执行选择。 我想要一些指导,以便在一次往返中聚合所有查询并发送到db。 我知道CreateMultiQuery()和CreateMultiCriteria()方法,但我不确定如何在下面的当前代码中实现 谢谢 foreach (Roll roll in attendanceRegisterRolls.Items) { RollAttendeeUpdater attendeeUpdater

我有一个方法,通过循环记录并对每条记录执行选择。 我想要一些指导,以便在一次往返中聚合所有查询并发送到db。 我知道CreateMultiQuery()和CreateMultiCriteria()方法,但我不确定如何在下面的当前代码中实现

谢谢

foreach (Roll roll in attendanceRegisterRolls.Items)
                {
                    RollAttendeeUpdater attendeeUpdater = new RollAttendeeUpdater(enrolmentRepository, roll);
                    attendeeUpdater.**AddNewStudentEnrolmentsAsAttendees();**
                    attendeeUpdater.RefreshEffectiveAttendance(register);
                }

**Constructor**
public RollAttendeeUpdater(IEnrolmentRepository enrolmentRepository, Roll roll)
    {
        _roll = roll;
        _enrolments = enrolmentRepository.GetByRoll(_roll);
    }

public interface IEnrolmentRepository : IRepository<Enrolment>
{
    IEnumerable<Enrolment> GetByRoll(Roll roll);
    bool IsStudyCompleted(string resultCode);
}
public IEnumerable<Enrolment> GetByRoll(Roll roll)
    {
        var query = _session.CreateQuery(
            @"select e 
            from Enrolment e 
            join fetch e.Student 
            where e.Roll.Id.RollNumber = :rollNumber and e.Roll.Id.Year = :year
            order by e.EnrolmentStatus");

        query.SetString("rollNumber", roll.Id.RollNumber);
        query.SetString("year", roll.Id.YearAsTwoDigitString);
        return query.List<Enrolment>();
    }
public void **AddNewStudentEnrolmentsAsAttendees()**
    {

        foreach (Enrolment enrolment in _enrolments)
        {
            Student student = enrolment.Student;

            if (student.IsActive)
                if (_roll.HasAttendee(student.Id) == false)
                    _roll.AddAttendee(student, new DateTimeRange(enrolment.StudyStartDate, enrolment.StudyEndDate));
        }
    }

public virtual bool HasAttendee(string studentId)
    {
        return _attendees.Any(a => a.Student.Id == studentId);
    }

也许您应该给RollAttendeeUpdater一整套要更新的卷,这样它就有足够的知识同时对所有卷执行GetByRoll()的一些变体


或者,让调用者完成查询,并传入登记表和登记列表,而不是传递存储库实例。

您当前发布的代码不包含任何NHibernate查询。您是否可以更新您的问题并在以下方法中显示您的代码:enrolmentRepository.GetByRoll()?为什么在
RollAttendee更新程序中使用
enrolmentRepository
,而不是在构造函数中为其提供注册信息。然后您可以一起批量选择easyly@Randy-GetByRoll()方法如上图所示,位于接口IEnrolmentRepository中。我认为sql是在addNewstudentenrolmentsasAttendeers()上创建的?如果有人能发布他们想法的样本,我将不胜感激-谢谢。谢谢奥斯卡-你能给我一个你回答的例子吗谢谢
select
 enrolment0_.id_enrolment as id1_1_0_,
 enrolledst1_.id_student as id1_10_1_,
 enrolment0_.study_start_date as study2_1_0_,
 enrolment0_.study_end_date as study3_1_0_,
 enrolment0_.id_eft as id4_1_0_,
 enrolment0_.enrolment_date as enrolment5_1_0_,
 enrolment0_.enrolment_start_date as enrolment6_1_0_,
 enrolment0_.enrolment_status as enrolment7_1_0_,
 enrolment0_.fee_band as fee8_1_0_,
 enrolment0_.id_course as id9_1_0_,
 enrolment0_.limitation_date as limitation10_1_0_,
 enrolment0_.result_date as result11_1_0_,
 enrolment0_.roll_number as roll12_1_0_,
 enrolment0_.year as year1_0_,
 enrolment0_.id_student as id14_1_0_,
 enrolment0_.result_code as result15_1_0_,
 enrolledst1_.surname as surname10_1_,
 enrolledst1_.given_names as given3_10_1_,
 enrolledst1_.preferred_name as preferred4_10_1_,
 enrolledst1_.title as title10_1_,
 enrolledst1_.gender as gender10_1_,
 enrolledst1_.tafe_international_id as tafe7_10_1_,
 enrolledst1_.active_ind as active8_10_1_,
 enrolledst1_.date_of_birth as date9_10_1_ 
from dt_modular_enrolment enrolment0_ inner join dt_student enrolledst1_ on enrolment0_.id_student=enrolledst1_.id_student 
where (
enrolment0_.roll_number=? )
and
(
    enrolment0_.year=? )
order by  enrolment0_.enrolment_status; p0 = 'AH0130',
p1 = '12'

SELECT
 attendees0_.roll_number as roll5_1_,
 attendees0_.year as year1_,
 attendees0_.id_class_attendee as id1_1_,
 attendees0_.id_class_attendee as id1_12_0_,
 attendees0_.attendance_start_date as attendance2_12_0_,
 attendees0_.attendance_end_date as attendance3_12_0_,
 attendees0_.enrolled_ind as enrolled4_12_0_,
 attendees0_.roll_number as roll5_12_0_,
 attendees0_.year as year12_0_,
 attendees0_.prospective_ind as prospect7_12_0_,
 attendees0_.student_identification as student8_12_0_ 
FROM dt_class_attendee attendees0_ 
WHERE attendees0_.roll_number=? and
 attendees0_.year=?; p0 = 'AH0130',
p1 = '12'