2014-10-16 6 views
1

Я получаю массив строк от моего клиента. Тогда в моем WebAPI я разделить его следующим образомОшибка при попытке использования содержит в Linq

var splitId = string.Join(",", ids); 

Тогда я мой Linq запрос я использую выше переменной

Это мой Linq запрос

var query = tableARepository.AsQueryable() 

.Where(a=> splitId.Contains(a.Id.ToString())) 
.Select(a => new { 
    Id = a.Id 
, Name = a.Name 
, FkId = tableBRepository.AsQueryable().Min(b => b.fkid=a.id) 
}); 

Я получаю это исключение:

LINQ to Entities не распознает метод 'System.String ToString()', и этот метод не может быть переведен в хранилище expressi . ","

Это из-за Содержит. Как я могу исправить эту ошибку?

+0

Вы разделили его, используя 'string.Join (", ", ids)'? Вы имеете в виду, что вы объедините их всех в одну строку. –

+1

Какой тип 'a.Id'? И считали ли вы негативные последствия использования списка, разделенного запятыми? (Представьте, что есть идентификатор «x», а другой «xy» - вам действительно нужно, чтобы запись 'x' соответствовала, когда кто-то ищет' xy'?) –

+0

@JonSkeet a.Id является integet. У меня нет проблемы с получением разных записей. – Happy

ответ

5

Вместо преобразования вашего ids в каскадной последовательности, держать их в List<T>/IEnumerable<T>, а затем запросить против этого типа:

Основываясь на ваш комментарий:

идентификаторами определяется как String [] ид

Вы должны преобразовать их в IEnumerable<int>List<int> или как:

List<int> integerIds = ids.Select(int.Parse).ToList(); 

, а затем в запросе:

var query = tableARepository.AsQueryable() 
.Where(a=> integerIds.Contains(a.Id)) 

Просто убедитесь, что ids содержит элементы одного и того же типа, что ваш стол Id

Причина вы получаете исключение из-за вызова ToString в ваш запрос LINQ, поставщик пытается преобразовать его при установке языка источника данных (может быть SQL), но он не может.

+0

вы можете показать, как конвертировать в список? – Happy

+0

@Happy, 'ids' будет' IEnumerable ', так как он используется в' string.Join', просто оставите его так, просто убедитесь, что он содержит данные того же типа, что и поле 'a.Id'. – Habib

+0

@Happy, как 'ids' определяется в вашем коде? – Habib