【发布时间】:2016-10-13 15:38:03
【问题描述】:
我在数据库中有实体,每个实体都包含一个键值对列表作为元数据。我想通过匹配元数据中的指定项目来返回对象列表。
即如果对象可以具有 KeyOne、KeyTwo 和 KeyThree 的元数据,我希望能够说“将 KeyOne 包含“abc”且 KeyThree 包含“de”的所有对象带回来
这是我的 C# 查询
var objects = repository.GetObjects().Where(t =>
request.SearchFilters.All(f =>
t.ObjectChild.Any(tt =>
tt.MetaDataPairs.Any(md =>
md.Key.ToLower() == f.Key.ToLower() && md.Value.ToLower().Contains(f.Value.ToLower())
)
)
)
).ToList();
这是我的请求类
[DataContract]
public class FindObjectRequest
{
[DataMember]
public IDictionary<string, string> SearchFilters { get; set; }
}
最后是我的元数据 POCO
[Table("MetaDataPair")]
public class DbMetaDataPair : IEntityComparable<DbMetaDataPair>
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
public string Key { get; set; }
public string Value { get; set; }
}
我得到的错误是
错误是无法创建类型的常量值 'System.Collections.Generic.KeyValuePair`2[[System.String, mscorlib, 版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]]'。 仅支持原始类型或枚举类型 上下文。
【问题讨论】:
-
这里的问题不在您帖子中的代码中。在执行查询之前,您正在其他地方转换为
KeyValuePair<string, string>。您能找到执行此操作的代码并将其发布吗? -
我认为这是您可以在 C# 查询中看到的字典“request.SearchFilters”。我认为 EF 将 Dictionary 转换为 IList
-
哦,等等,您没有转换 - 您在
Any()和f中使用了 kvp。使用前将f.Key和f.Value保存到局部变量中 -
我将假设您正在使用 Sql Server 并且您的 Collation 设置为 CI(默认),在这种情况下,所有
ToLower()调用都是多余的。
标签: c# sql entity-framework linq