Как использовать Содержит с Guid?

1

Я пытаюсь получить все enities из контекста, которые находятся внутри коллекции. Хотя он работает следующим образом:

Ticket ticket = context.Tickets.Where(p => p.TicketId == ticketId);
ticket.Tasks.Where(p => !message.Tasks.Select(t => t.Id).Contains(p.Id));

это заканчивается таким исключением

context.Tasks.Where(p => message.Tasks.Select(t => t.Id).Contains(p.Id));

Обратите внимание, что Id имеет тип Guid

Мой вопрос: как я могу написать второй запрос, чтобы получить все Задачи из контекста, входящего в состав сообщения. Коллекция задач?

редактировать

NotSupportedException

Невозможно создать постоянное значение типа DataObjects.KeyValueDataObject'2 [[System.Guid, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Version = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089]] '. В этом контексте поддерживаются только примитивные типы или типы перечислений.

И класс

public class KeyValueDataObject 
{ 
    public TKey Id { get; set; } 
    public TValue Name { get; set; } 
}

Реализован как KeyValueDataObject<Guid,String>

Теги:
entity-framework
entity-framework-6.1

3 ответа

3
Лучший ответ

Проблема в том, что Linq-to-Entities должен преобразовать ваш список в постоянное выражение, чтобы превратить ваши Contains в инструкцию IN, которая может не работать с GUID

Попробуйте сначала извлечь поисковые запросы в "постоянный" список:

var lookup = message.Tasks.Select(t => t.Id).ToList();
context.Tasks.Where(p => lookup.Contains(p.Id));
  • 0
    Это оно! Благодарю вас!
1

Попробуй это:

var taskIds = message.Tasks.Select(t => t.Id).ToArray();
context.Tasks.Where(p => taskIds.Any(t => t.Id == p.Id));
  • 0
    Нет :( всё то же исключение
  • 0
    Я не осознавал, что Tasks - это KeyValuePair. Обновил мой ответ сейчас.
Показать ещё 1 комментарий
1

Попробуйте следующее:

var tasks = context.Tasks.ToList().Where(p => message.Tasks.ToList().Any(t => t.Id.Contains(p.Id)));

Я надеюсь, что эта помощь

код EDITED

  • 0
    Спасибо за ответ, но он заканчивается на Cannot convert lambda expression to delegate type 'System.Func<KeyValueDataObject<System.Guid,string>,bool>' because some of the return types in the block are not implicitly convertible to the delegate return type Я думаю, это из-за общего типа данных?
  • 0
    Да, может быть. Почему бы вам не попробовать преобразовать Id в строку вместо того, чтобы пытаться работать с самими Guids? Что-то вроде KeyValueDataObject <String, String>
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню