C# 带有JSON字符串的LinQ

C# 带有JSON字符串的LinQ,c#,vb.net,linq,C#,Vb.net,Linq,假设我在SQL数据库中有一个表用户,其结构如下: FirstName LastName Age Address ------------`----------- ----- ---------------------------------------------------------------------------------------------------- Homer Simpson 40 {"streetAddress": "2

假设我在SQL数据库中有一个表用户,其结构如下:

FirstName    LastName    Age   Address   
------------`----------- ----- ----------------------------------------------------------------------------------------------------
Homer        Simpson     40    {"streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100"}
Homer        Simpson     40    {"streetAddress": "742 Evergreen Terrace", "city": "Springfield", "state": "NV", "postalCode": "89001"}
我想创建一个LinQ查询,让所有荷马·辛普森住在内华达州。 我正在使用VB.NET和实体框架,因此我从dbContext开始:

dbContext.Users.Where(Function(f As User) f.FirstName = "Homer",
                                          f.LastName = "Simpsom",
                                          f.Address.Contains("\"state\": \"NV\"")) 'This is where I block

这是正确的吗?是的,但这是一个好方法吗?

在数据库模式中,您要做的是获取以关系、行/列SQL格式结构化的数据,并将结构化为层次结构、键值文档的一列数据放入其中。当然,这限制了您智能地查询内部JSON数据的能力,并且您依赖于一个简单的子字符串搜索,这是脆弱的-如果“state”和“NV”之间没有空格会发生什么?您的查询可能会中断

改进这一点的一种可能性是将JSON分解为关系结构。从您的示例数据来看,您的数据似乎相对简单。您可以创建一个
地址
表,将JSON保存到其中,将每个字段保存到一列中,并将其链接到您的用户表,甚至可以将地址列直接放在用户表中

顺便说一句,JSON并不是我见过的唯一一种非关系层次键值格式。MS SQL自2005年起就支持XML类型的字段,并包含用于智能查询XML的特殊语法。我以类似的方式看到了这一点,允许您查询字段中的数据,而不是文本。然而,我不知道其他数据库是否也有这种支持