2012-05-08 2 views
1

좋아, 성능을 위해 EF를 다시 테스트하고 데이터베이스에서 간단한 결과를 얻고 싶습니다.Entity Framework에서 테이블을 조인하지 못하게하려면 어떻게합니까?

var jobsList = from j in mf.Jobs 
         where j.UserID == 1001 select new { Job = j }; 

이 불행하게도 내가 EF는하고 싶지 않아이 목록에 내 사용자 개체를 결합한다. 관계가 있기 때문에 EF에 가입하지 말라고 어떻게 말합니까? 기본적으로 나는 그 테이블에서 간단한 행을 원한다.

아니면 다른 유형의 검색을 사용해야합니까? 나는 여전히 데이터베이스 검색의 기본 유형을 아래에서 사용하고 있으며 db 작업을 더 잘 처리 할 수있는 방법이 있다고 생각합니다. 내가 좀 더 명확 맥락에서 말하고 기본적으로 무엇을

SqlConnection myconnection = new SqlConnection(); 

편집

. 그것은 단지 다음을 얻는 것이 아닙니다.

Job.JobID 
Job.UserID 
//Extra properties 

나는 사용자 개체가 쉽게 필요한보다 훨씬 더 많은 메모리를 소비하는

Job.JobID 
Job.UserID 
Job.User 
//Extra properties 

을 가져, 게다가 나는 그것을 필요하지 않습니다.

내 솔루션

그래서 난 아직도 왜 여기에 너무 많은 EF 믿고 있지 않다. LazyLoading을 해제하고 켜기 만하면 성능 차이가 너무 많이 나는 것을 눈치 채지 못했습니다. 그런 다음 SqlConnection 형식 메서드가 내 EF 메서드와 비교하여 사용하는 데이터의 양을 비교했습니다.

정확히 동일한 결과 세트가 반환되며 여기에는 성능 차이가 있습니다.

내 Entity Framework 메서드의 경우 작업 목록이 반환됩니다.

MyDataEntities mf = new MyDataEntities(); // 4MB for the connection...really? 
mf.ContextOptions.LazyLoadingEnabled = false; 
// 9MB for the list below 
var test = from j in mf.Jobs 
      where j.UserID == 1031 
      select j; 
foreach (Job job in test) { 
    Console.WriteLine(job.JobID); 
} 

Stored Proc를 실행하고 결과 집합을 반환하는 내 SqlConnection 메서드의 경우.

//356 KB for the connection and the EXACT same list. 
List<MyCustomDataSource.Jobs> myJobs = MyCustomDataSource.Jobs.GetJobs(1031); 

나는 완전히 엔티티 프레임 워크는 방법 표준도록 SqlConnection보다 훨씬 더 많이하고있는 것을 이해하지만, 왜 결과 세트에 대한 25 배 더 많은 메모리의 최소 걸릴 것입니다 경우이 모든 과대 광고. 그냥 가치가없는 것 같습니다.

내 솔루션은 결국 EF와 함께 가지 않습니다.

+0

생성 된 SQL의 모양은 어떻습니까? – Magnus

+3

느린 로딩이 활성화되어 있습니까? 그렇지 않은 경우 사용자 속성을 열망하기 때문에 조인이 될 수 있습니다. –

+0

"이 불행히도 내 사용자 개체를이 목록에 조인"한다는 것은 무엇을 의미합니까? – JotaBe

답변

1

User 속성은 작업 클래스의 일부이지만 액세스 할 때까지로드되지 않습니다 (지연로드). 그래서 실제로 "가입"되지 않습니다.

만 지정하는 2 열을 원하는 경우

var jobsList = from j in mf.Jobs 
       where j.UserID == 1001 
       select new { 
          Job.JobID, 
          Job.UserID 
          }; 
+0

좋아,이게 내가 필요한 것 같아. 기본적으로 특정 클래스와 해당 클래스 또는이 경우 테이블 만 반환하려면 원하는 필드를 필드별로 지정해야합니다. – meanbunny

+1

@ meanbunny 테이블 작업의 모든 값을 반환하려면'... select job'이라고 쓰면 관련 테이블이 개체에 표시되지만로드되지는 않습니다. – Magnus

+0

아하 지금 보았습니다. 이것을 테스트 한 후에는 완벽하게 이해할 수 있습니다. 도와주세요. – meanbunny

0

EF는 하나의 결과 만 원한다고 생각하지 않습니다. 이런 식으로 해보십시오.

Job jobsItem = mf.Jobs.Single(j=>j.UserID==1001) 

당신이 lambas 사용하지 않으려는 경우

...

Job JobItem = (from j in mf.Jobs where j.UserID == 1001 select j).Single() 

내가 지금 가까이하지 컴파일러를 가지고, 나는 구문이 바로 바랍니다. 변수에 Job 대신 var을 사용할 수 있습니다. 아무런 효과가 없지만이 경우에는 Job이 더 읽기 쉽습니다.

+0

구문이 완벽하다고 생각합니다. 그러나, 나의 편집을 체크 아웃하고 내가 말하는 것에 대해 더 많이 보아라. 처음에는 불완전한 설명을 드려 죄송합니다. 기본적으로 나는 UserID 및 User가 아닌 UserID 만 다시 원합니다. – meanbunny

+0

Ok : D 편집 내용을 읽었습니다. 그렇다면 게으른 로딩 개념에 관한 것입니다. Jota처럼 당신에게 그것을 권 해드립니다. – Jonathan

1

이 문제에 대한 가장 가능성이 높은 이유는 true로 LazyLoadingEnabled property 세트를 가지고 있다는 것입니다 쓸 수 있습니다.

이 경우 사용자는 원래 쿼리에서 복구되지 않습니다. 하지만이 속성에 액세스하려고하면 디버깅 중에 검사를 통해 수행하더라도 데이터베이스에서로드됩니다. 그러나 당신이 그것을 액세스하려고 할 때만.

이것을 열어서 SQL Server 프로파일 러를 열고 DB로 보낸 명령을 확인할 수 있습니다.

코드가 열심히로드하거나 명시 적으로로드하지 않습니다. 그래서 이것이 이유가되어야합니다.

0

사용자는 Job의 User 속성에 액세스 할 때까지 실제로 컨텍스트에 연결되지 않습니다. User에 대해 null을 얻으려면 Lazy Loading을 해제하십시오.

관련 문제