我试图从集合中的上下文中获取所有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
我的问题是如何编写第二个查询以从message.Tasks集合中的上下文中获取所有任务?
修改
NotSupportedException异常
无法创建类型的常量值 ' DataObjects.KeyValueDataObject`2 [[System.Guid,mscorlib, 版本= 4.0.0.0,文化=中立, PublicKeyToken = b77a5c561934e089],[System.String,mscorlib, Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'。 此处仅支持原始类型或枚举类型 上下文。
和班级
public class KeyValueDataObject
{
public TKey Id { get; set; }
public TValue Name { get; set; }
}
已实施为KeyValueDataObject<Guid,String>
答案 0 :(得分:3)
问题在于Linq-to-Entities需要将您的列表转换为常量表达式,以便将Contains
转换为IN
语句,这可能不适用于GUID
尝试将查找提取到&#34;常量&#34;首先列出:
var lookup = message.Tasks.Select(t => t.Id).ToList();
context.Tasks.Where(p => lookup.Contains(p.Id));
答案 1 :(得分:1)
试试这个:
var tasks = context.Tasks.ToList().Where(p => message.Tasks.ToList().Any(t => t.Id.Contains(p.Id)));
我希望这个帮助
code EDITED
答案 2 :(得分:1)
试试这个:
var taskIds = message.Tasks.Select(t => t.Id).ToArray();
context.Tasks.Where(p => taskIds.Any(t => t.Id == p.Id));