Проблема с Содержит - PullRequest
       25

Проблема с Содержит

0 голосов
/ 19 апреля 2010

У меня есть маленькая проблема, которую я не могу решить. Я хочу использовать 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, а идентификатором является тип Guid. Я пробовал несколько вещей (конвертировать Guid в String, а затем с помощью .Contains и т. Д.), но я всегда получаю исключение, которое говорит:

«Linq to Entities» не распознает метод «Boolean Contains (System.Guid)» и Не может Перевести этот метод в выражение памяти. (Как-то так, потому что я использую немецкую версию VS2008)

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

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

Ответы [ 3 ]

0 голосов
/ 19 апреля 2010

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

Первый подход: не конвертируйте ничего. Это предполагает, что 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 голосов
/ 20 апреля 2010

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

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

0 голосов
/ 19 апреля 2010

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

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

Доброжелательность,

Dan

...