2011-03-03 3 views
4

이것이 가장 효율적인 방법인지 궁금합니다. subselect 같은 메서드를 호출하는 대신 하나의 문 안에 모든 linq 데 방법이 있습니까? 방법 코드가 명확하고보다 재사용 만들면서 GetEmployeeCurrentStatus (...)를 갖는 관계없이 효율linq 문에서 함수 호출

public string GetEmployeeCurrentStatus(string username) 
     { 
      using (Entities db = new Entities()) 
      { 
       var times = (from d in db.TimeTables 
          where d.DateTime == DateTime.Today && 
          d.Employee.Username == username 
          select d) 
          .OrderByDescending(d => d.TimeID).FirstOrDefault(); 

       return (x.ClockOut == null ? "IN" : "OUT");         
      } 
     } 
+0

사용자 - 어떻게 작동하는지 알 수 없습니다. x.clockout은 어디에서 왔습니까? 시간이되어야 할까. 클락 아웃? –

+0

네, 저의 실수는 미안합니다. – scouserider

답변

3

는 방법에 대해 :

newEmployee = (db.employees.Select(emp => new 
        { 
         emp.EmployeeID, 
         emp.Username, 
         Status = db.TimeTables 
         .Where(d => d.Employee.Username == emp.Username 
          && d.DateTime == DateTime.Today) 
          .Select(x => x.ClockOut == null ? "IN" : "OUT") 
          .FirstOrDefault() 
        })).ToList(); 

귀하의 시도는 청소기을 표시하고 기능적으로 괜찮 수 있습니다. 그러나 보조 DB 호출이 실행 중입니다. 이것은 확장 성 및 성능에 좋지 않습니다. 내가 게시 한 버전은 동일한 초기 db 연결을 사용하고 1-1을 만듭니다. 이렇게하면 리소스 사용량을 줄일 수있을뿐만 아니라 쿼리를보다 정확하고 빠르게 수행 할 수 있습니다.

0

:

newEmployee = (from emp 
       in db.employees 
       select new 
       { 
        a.EmployeeID, 
        a.Username, 
        Status = emp.GetEmployeeCurrentStatus(a.Username) 
       }).ToList(); 

는 직원의 상태를 반환 GetEmployeeCurrentStatus이다.

+0

그래,하지만 데이터베이스에 두 번 전화하는 거 아니니? – scouserider

2

쿼리 (또는 데이터베이스를 사용하여 실행될 쿼리의 일부) 내에서 사용자 지정 메서드를 실제로 호출 할 수 없습니다. 당신은 기본적으로 두 가지 옵션이 있습니다

  • 그 같은 쿼리를 작성하는 방법 호출 할 필요가 select 수행하기 전에

    • 전화 ToList (이 방법으로,이 방법은 메모리 내에서 호출됩니다 데이터) 가능한 경우 SQL 서버에서 모두 실행할 수 있습니다. 이는 predicate builderAsExpandable 확장자를 사용하여 수행 할 수 있습니다. 이 작동 방식에 대한 자세한 내용은 my blog post을 참조하십시오.

  • 1

    작은 데이터 (직원 수)에 대해서는 괜찮지 만 각 GetEmployeeCurrentStatus에는 SQL 연결이 필요하므로 그 모범 사례는 아닙니다. 나는 개인적으로 모든 직원 (데이터베이스에 하나의 여행)를 얻을 것이다 그리고 모든 직원 상태 (데이터베이스에 하나의 여행)을 얻을 그래서 난 지금 내가이 가정

    0

    도움이 로컬

    희망을 그들과 합류 것, 그들 모두를 현금으로 LINQ to SQL 또는 EF를 사용하고 있다면 쿼리를 리팩터링하여 Join을 사용합니다. 이렇게하면 두 개의 별도 쿼리 대신 데이터베이스에서 단일 SQL 쿼리를 효율적으로 실행할 수 있습니다.