2015-09-11 4 views
3

Какие-либо идеи о том, что проблема может быть здесь в запросе EF DbContext? Насколько я понял, это должно работать согласно fellow SO poster.Неожиданный - Нельзя сравнивать элементы типа 'System.Int32 []'. Поддерживаются только примитивные типы, типы перечисления и типы сущностей.

Я пробовал списки, null, а не нулевые проверки, но безрезультатно. Запрос действительно работает, если я удалю нулевую проверку и просто оставьте Contains(). Тем не менее, это требование, чтобы вернуть все записи, если testIDs является нулевым.

var testIDs = new int[] { 1, 3 }; 
var test = session.All<VendorBooking>(x => testIDs == null || testIDs.Contains(x.VendorServiceID)).ToList(); 

(session.All просто использует context.Set<T>.Where())

Исключение брошено: 'System.NotSupportedException' в EntityFramework.SqlServer.dll

Дополнительная информация: Невозможно сравнить элементы типа ' System.Int32 []. Поддерживаются только примитивные типы, типы перечисления и объекты .

enter image description here

Большое спасибо

+0

какая версия EF и .net вы используете? – Backs

+0

EntityFramework v6.1.3 (последний AFAIK), .NET 4.5.1 – GONeale

ответ

4

Что-то вроде этого, может быть. Кроме того, вы можете извлечь общие части и сделать их короче.

var testIDs = new int[] { 1, 3 }; 
if (testIDs == null) 
{ 
    var test = session.All<VendorBooking>() 
     .ToList(); 
} 
else 
{ 
    var test = session.All<VendorBooking>(x => testIDs.Contains(x.VendorServiceID)) 
     .ToList(); 
} 
+0

Я вижу. Или просто добавьте предложение Where() через if/else. Хорошая идея. Благодарю. Я очень удивлен EF, я думаю, что нулевая проверка массивов должна быть фундаментально поддержана. – GONeale

+0

@GONeale somethimes EF очень странно, да – Backs

+0

@GONeale Я думаю, у меня есть идея, почему это происходит. В C# (.net) у нас есть коллекции (массивы, списки и т. Д.), Но у нас нет коллекций в sql-сервере. Итак, linq2sql не может передать коллекцию на сервер, чтобы проверить его на нуль – Backs

0

testIdsне может быть пустым, поэтому попробовать это

var testIDs = new int[] { 1, 3 }; 
var test = session 
    .All<VendorBooking>(x => testIDs.Contains(x.VendorServiceID)) 
    .ToList(); 

Пересмотренный

var results = (testIds == null || testIds.Length == 0) 
    ? session.All<VendorBooking>() 
    : session.All<VendorBooking>(x => testIDs.Contains(x.VendorServiceID)); 
var test = results.ToList(); 
+0

Как вернуть все записи о случаях, когда идентификаторы testID равны нулю, если я исключаю эту проверку? – GONeale

+1

Похоже, у @Backs есть ваш ответ. –

+0

Спасибо, хотя Ричард. – GONeale

0
var test = session.All<VendorBooking>(x => testIDs.Contains()==0 || 
    testIDs.Contains(x.VendorServiceID)).ToList(); 

Это работает нормально. Не путайте оператор OR, поэтому только одно условие должно быть true для полного выражения: true. testIDs.Contains(x.VendorServiceID) оценивает по true, когда любое значение было отправлено до testIDs, в противном случае testIDs.Contains()==0 имеет значение true, когда null был принят.

Смежные вопросы

 Смежные вопросы