2010-04-19 4 views
0

У меня есть небольшая проблема, которую я не могу решить. Я хочу использовать SQL-In-Statement в Linq. Я читал на этом Форуме и в других форумах, что я должен использовать .Contains (с обратным мышлением-обозначением :-)). В качестве ввода у меня есть список гидов. Я первый скопировал их в массив, а затем сделал что-то вроде этого:Проблема с содержит

datatoget = (from p in objectContext.MyDataSet 
      where ArrayToSearch.Contains(p.Subtable.Id.ToString()) 
      select p).ToList(); 

datatoget является результатом, в котором все записи, соответствующие Subtable.Id (который является Guid) должны быть сохранены. Подтаблица - это подробный стол из MyData, а Id - тип Guid. я пытался несколько вещей (Преобразование Guid в строку, а затем с помощью .Contains и т.д.), , но я всегда получаю исключение, которое говорит:

«Linq к Entities» не признает Логический метод»Содержит (System.Guid) и не может преобразовать этот метод в выражение памяти. (что-то вроде этого, потому что я использую немецкую версию VS2008)

Я использую L2E с .NET 3.5 и я программирования в C# с VS 2008.

Я прочитал несколько примеров, но он не работает. Возможно, это из-за использования Guid вместо строк? Я также пытался написать свою собственную функцию сравнения, но я не знаю, как ее интегрировать, чтобы .NET вызывала мою функцию для сравнения.

+3

См. Также http://stackoverflow.com/questions/374267/contains-workaround-using-linq-to-entities –

+0

Роберт прав, это дубликат для 3.5, но также 4.0 непосредственно поддерживает 'Contains()'. –

ответ

0

Не могли бы вы использовать Any() на arrayToSearch?

datatoget = objectContext 
       .MyDataSet 
       .Where(p => arrayToSearch.Any(i => i == p.Subtable.Id.ToString()) 
       .ToList(); 

Kindness,

Dan

0

Я хотел бы попробовать эти два подхода:

Первый подход: ничего не конвертировать. Это предполагает, что p.Subtable.Id определяется как GUID в базе данных.

Guid[] guids = GetGuids(); 

var dataToGet = (from p in objectContext.MyDataSet 
       where guids.Contains(p.Subtable.Id) 
       select p).ToList(); 

Второй подход: сначала преобразовать все идентификаторы GUID в строки.

string[] guids = GetGuids().Select(g => g.ToString()).ToArray(); 

var dataToGet = (from p in objectContext.MyDataSet 
       where guids.Contains(p.Subtable.Id.ToString()) 
       select p).ToList(); 

Если ни один из этих подходов работает, то мы, вероятно, нужно, чтобы увидеть больше информации о проблеме, например, схемы базы данных, формы сущностей и т.д.

0

спасибо за ваши расходы время на мой вопрос. Ссылка из Robert Havery сделала это :) Как я могу видеть .Contains() не работает (хорошо) с Linq для Entities и .NET3.5. Нет возможности сделать это без написания метода расширения. Я немного поработал с LinqPad и при использовании Linq 2 SQL никаких проблем с .Contains(). Он сделал это, как и было обещано. И с Linq to Entities не было никаких обещаний, за исключением того, что я всегда получал исключение (но это тоже обещание :)).

Особая благодарность Роберту Хэвери и всем остальным, которые помогли мне.

+0

Вы * можете * сделать это с помощью метода расширения в 3.5, как показывает ссылка Роберта. –