【问题标题】:How to use Contains with Guid?如何在 Guid 中使用包含?
【发布时间】:2017-12-16 05:32:13
【问题描述】:

我正在尝试从集合中的上下文中获取所有实体。虽然它是这样工作的:

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, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]]'。 仅支持原始类型或枚举类型 上下文。

还有班级

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

实现为KeyValueDataObject<Guid,String>

【问题讨论】:

  • 有什么异常?

标签: c# .net entity-framework entity-framework-6.1


【解决方案1】:

问题是 Linq-to-Entities 需要将您的列表转换为常量表达式,以便将您的 Contains 转换为 IN 语句,这可能不适用于 GUID

先尝试将查找提取到“常量”列表中:

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

【讨论】:

  • 就是这样!谢谢!
【解决方案2】:

试试这个:

var taskIds = message.Tasks.Select(t => t.Id).ToArray();
context.Tasks.Where(p => taskIds.Any(t => t.Id == p.Id));

【讨论】:

  • 否 :( 还是一样的异常
  • 我没有意识到 Tasks 是一个 KeyValuePair。现在更新我的答案。
  • 你是对的!我选择了禁食的正确的。反正你得到了我的 +1
【解决方案3】:

试试这个:

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

希望对你有帮助

代码已编辑

【讨论】:

  • 感谢您的回复,但它以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 结尾我猜是因为通用数据类型?
  • 是的,也许。为什么不尝试将 Id 转换为字符串,而不是尝试使用 Guid 本身?类似 KeyValueDataObject
  • 那么以Instance argument: cannot convert from 'System.Collections.Generic.IEnumerable<string>' to 'System.Linq.IQueryable<System.Guid>'结尾
  • mm,也许是我写的编辑过的代码。转换 ToList 两个部分,但是..我不太确定,现在只是猜测并试图帮助你。
  • 你是对的!我选择了禁食的正确的。反正你得到了我的 +1
猜你喜欢
  • 2022-08-15
  • 2023-03-31
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多