2013-08-27 1 views
0

내가 가진 것은 대부분 테이블 키가 GUID가되는 데이터베이스입니다. 문제는 LINQ to Entity 문을 수행하려고 할 때 참조하는 엔터티 중 하나에있는 Guid와 사용할 수있는 Guid를 비교하면 SQL이 실행되지 않습니다. 필자는 SQL 프로파일 러를 실행하면서 SQL Server 2008 R2를 사용하여 이것을 테스트했으며 SQL 문을 수행 할 때 SQL Server가 데이터베이스를 분명히 만들지 않았습니다. Guid 비교를 수행하면 SQL이 SQL Server로 전달되고 결과가 다시 반환됩니다. 예를 들어Entity Framework 5 SQL이 실행되지 않고 GUID가 비교됩니다.

: 나는 그런 x.itemType.CompareTo (나타내고 itemtype)와 같은 다른 방법을 시도했지만 아무것도 작동하지 않습니다

var itemType = new Guid("27733204-C1E6-4F93-BEAD-63C2C8EBC299"); 
var items from myDBContext.Items.Where(x => x.itemType == itemType); 

. 본질적으로 내가 Guid를 가지고 있다면 linq 문 자체의 범위를 벗어나는 Where 절의 모든 유형을 사용하고 싶습니다. 서버에 발행 된 SQL은 전혀 없습니다.

누군가에게 답이 있기를 바랍니다. 현재 C# 4.5와 함께 Entity Framework 5를 사용하고 있습니다.

+0

어떤 버전의 .NET? –

+0

큰 따옴표를 사용해야하는 곳에 작은 따옴표를 사용하고 있습니다. 그래서 당신이 실제 코드를 게시하지 않는다고 느끼고 있습니다. 여기에있는 것은 컴파일되지 않습니다. 제공된 코드에서 – Khan

+0

당신은 linq 표현식을 평가하지 않습니다 : myDBContext.Items.Where (x => x.itemType == itemType). 문제가 있다면 myDBContext.Items.Where (x => x.itemType == itemType) .ToArray();를 사용해보십시오. –

답변

1
If I take out the Guid comparison, then the sql is passed to SQL Server and I get a result back. 

을보십시오. LINQ 메서드는 deferred execution을 지원합니다. 지연 실행은 결과가 필요할 때까지 쿼리가 실행되지 않는다는 것을 기본적으로 의미합니다. 일반적으로 시퀀스를 반환하는 메서드는 지연된 실행을 사용합니다.

Where()은 지연된 실행을 사용하는 방법 중 하나입니다. Single()/SingleOrDefault() 즉시 실행하십시오. 즉, 후자의 유형의 메소드가 즉시 실행되므로 결과를 반복하지 않고도 프로파일 러에서 SQL 트래픽을 볼 수 있습니다.

  IEnumerable<Catalog> result; 
      Catalog result2; 
      using (var context = new ExampleEntities()) 
      { 
       var itemType = new Guid("E8110BDE-8433-4C49-BA9A-034DEA2FA20E"); 
       result = context.Items.Where(x => x.ItemID == itemType);//deferred 
       result2 = context.Items.First();//immediate 

       //The foreach code below causes the deferred query to execute. 
       if (result != null) 
       { 
        foreach (var catalog in result) 
        { 
         Console.WriteLine("{0}, {1}", catalog.ItemID, catalog.ModifiedDate); 
        } 
       } 
      }  
+0

ToList()를 호출하여 실행을 강제해야하므로 그 결과를 줄 것입니다. 지연에 대해서도 생각조차하지 않았습니다. 나는 갱신으로 돌아갈 것이다. –

+0

사실 브라이언, 흥미 롭습니다. 결과를 주목하십시오! = null - 내 주요 문제가 있었던 곳입니다. 결과는 항상 null이므로 foreach가 실행되지 않습니다. –

-1

는 쿼리가 즉시 실행하는 원인이 변경 어떤 코드에 대한 설명에서 다음

// Create a sample item 
var itemType = new Guid("27733204-C1E6-4F93-BEAD-63C2C8EBC299"); 

// Create a holder for the value of ItemType. 
// EF will not be able to translate itemType.ToString() 
// to SQL if you try to call it directly. 
var itemTypeValue = itemType.ToString(); 

// Execute your query 
// I placed ToList() to force the 
// execution. You can use anything 
// that will cause the query to enumerate. 
var items from myDBContext.Items.Where(x => x.itemType == itemTypeValue).ToList(); 
+0

이것은 컴파일되지 않습니다. String에서 Guid로 ==를 할 수 없습니다. –

관련 문제