2013-08-27 2 views
0

У меня есть база данных с большинством клавиш таблиц, которые являются Guid. Проблема в том, что если я попытаюсь выполнить оператор LINQ to Entity, и я сравниваю Guid, который у меня есть для Guid, который существует в одном из объектов, на которые я ссылаюсь, SQL никогда не запускается! Я протестировал это, используя SQL Server 2008 R2 с запуском SQL Profiler, и при выполнении инструкции sql явно не делает этого в базе данных. Если я выберу сравнение Guid, то sql передается SQL Server, и я получаю результат обратно.Entity Framework 5 Проводит сравнение результатов сравнения без выполнения SQL

Например:

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

Я пробовал другие методы, такие, как x.itemType.CompareTo (ItemType), но ничего не работает. По сути, если у меня есть Guid, который я хотел бы использовать в любом типе предложения Where, который выходит за рамки самой инструкции linq, я не получаю абсолютно никакого SQL, выдаваемого серверу.

Я надеюсь, что у кого-то есть ответы. В настоящее время используется Entity Framework 5 с C# 4.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 - вот где моя основная проблема. Результат всегда равен нулю, и поэтому 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

Это не скомпилирует - не может сделать == из строки в Guid. –