【问题标题】:Linq check unique value from a column with commaLinq检查带有逗号的列中的唯一值
【发布时间】:2016-11-04 15:27:13
【问题描述】:

我有一个表格,我将名字保存在 Firstname , Lastname 模式中

但当用户输入此值时,名称之间的空格可能不规则 那么如何使用 Linq 检查列值是否唯一

 string name_input = "a , b"; 
if (context.TableRankHolders.Any(q => q.Name == name_input))
{
  //name exists
}

我想要做的是将输入字符串格式化为严格的“a,b”模式,方法是删除逗号前后所有不需要的空格,如示例中所示

在数据库中,名称值采用不同的格式,例如逗号之间可能没有空格或逗号之间有更多空格,例如“a,b”/“a,b”/“a,b”/“a,b”等 现在检查使用 LINQ 查询,但是我如何格式化名称以根据列中的逗号进行拆分

唯一的共同点就是必须有,现在,我猜方法就像 拆分,并检查第 0 部分和第 1 部分是否存在于 db 中以获取单行

【问题讨论】:

  • formatted_name 中的值是多少
  • 请参阅说明中的编辑
  • 我不知道您的上下文,但将名字 + 姓氏作为唯一字段似乎并不常见。两个人可能很容易被同名。也就是说,我会亲自删除所有空格并比较有一些字符、逗号和更多字符。你永远不知道用户会输入什么。
  • @msanz 是的,你是对的,这样做的目的是防止再次错误地输入同一个人的详细信息。如果存在相同的名称,客户端将对名称进行一些调整,例如 Jr 或 Sr 等以使其唯一。
  • @msanz 单独的字段将仅cause more problems。我会完全停止请求<firstname>, <lastname>,让他们随意输入他们的名字。

标签: c# linq


【解决方案1】:

假设名称中没有空格,您可以使用简单的:

context.TableRankHolders.Any(q => q.Name.Replace(" ", "") == name_input.Replace(" ", ""))

可能会一路检查nulls。如果您希望名称中有空格,则应使用以下内容:

bool CheckNames(string a, string b)
{
    string[] splitA = a.Split(',').Select(q => q.Trim(' ')).ToArray();
    string[] splitB = b.Split(',').Select(q => q.Trim(' ')).ToArray();
    return splitA.SequenceEqual(splitB);
}

...
context.TableRankHolders.Any(q => CheckNames(q.Name, name_input))

【讨论】:

  • 无论如何都要将字符串格式作为 LINQ where 子句的一部分。如果我们可以这样做,我可以制作类似的东西 string.format("{0},{1}",name.split(,)[0],name.split(,)[1])
  • 您也可以这样做(请记住,这里的关键部分是 Trim 调用)或只是在 Any 调用中内联此函数(但这不是可读的 IMO) :context.TableRankHolders.Any(q => q.Split(',').Select(w => w.Trim(' ')).SequenceEqual(name_input.Split(',').Select(w => w.Trim(' '))))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 2020-02-24
相关资源
最近更新 更多