C# 使用L2S或SQL返回部分地址匹配和不匹配位置

C# 使用L2S或SQL返回部分地址匹配和不匹配位置,c#,sql,linq-to-sql,multiple-matches,C#,Sql,Linq To Sql,Multiple Matches,我需要实现一个方法,该方法将地址拆分为各个部分,并从地址表返回任何匹配项。如果没有找到匹配项,我希望能够返回一个值,指示失败的位置。每个输入参数在表中都有相应的字段 签名看起来像这样: List<Address> MatchAddress(string zipCode, string streetName, string houseNumber, string houseLetter, string floor, string appartmentNo, out int mismat

我需要实现一个方法,该方法将地址拆分为各个部分,并从地址表返回任何匹配项。如果没有找到匹配项,我希望能够返回一个值,指示失败的位置。每个输入参数在表中都有相应的字段

签名看起来像这样:

List<Address> MatchAddress(string zipCode, string streetName, string houseNumber, string houseLetter, string floor, string appartmentNo, out int mismatchPosition)
{
  // return matching addresses
  // if none found, return the position where it stopped matching
  // zipCode is position 0, appartmentNo is position 5
  //
  // an empty param value indicates "don't check"
}
列出匹配地址(字符串zipCode、字符串streetName、字符串houseNumber、字符串houseLetter、字符串楼层、字符串公寓号、out int不匹配位置)
{
//返回匹配的地址
//如果未找到,则返回其停止匹配的位置
//zipCode为位置0,装置编号为位置5
//
//空参数值表示“不检查”
}

我知道我可以构造这样的方法:从所有参数开始,执行查询,然后逐个参数(从右侧)删除param,直到找到匹配项或参数用尽为止,但是我可以构造一个比这更有效的查询,即最小化对db的调用数,甚至可以作为一个调用?

我认为您可以使用case语句和一些嵌套查询在一个查询中获得解决方案,但在我开始之前,我不确定我是否遵循了您试图实现的目标。假设以下示例数据集:

ID   House_Number    Street_Name   Zip_Code
=============================================
1            3012            Elm      10010
2             412            9th      10010
3             412           Main      90210
4             710           Main      60606
还假设以下方法调用,传入zip、姓名和门牌号:

MatchAddress('10010', 'Main', '710')
在这种情况下你想得到什么?您的签名有一个用于不匹配位置的单独变量,但本例将部分匹配至少一个元素上涉及的所有四个记录。例如,对于记录1,您希望返回什么,其中邮政编码匹配,但房屋号码或街道名称属性不匹配

======================================

好的,看到你的评论了。这里有一个问题,我认为对你来说是正确的。WHERE子句是一系列OR,返回至少符合一个条件的任何记录。然后case语句查看它们与传入值不相等的地方。显然,最不特定的匹配是主观的,但是您可以重新排序case语句,以将所需的匹配条件按您想要的顺序排列。我在MySQL数据库上做了这个

SELECT address.*, CASE 
    WHEN zip_code <> '10010' THEN 'No match on Zip'
    WHEN street_name <> 'Elm' THEN 'No match on Street Name'
    WHEN house_number <> '29' THEN 'No match on House Number'
    ELSE 'Match on all elements'
  END AS zip_match
from address
where zip_code = '10010'
OR street_name = 'Elm'
OR house_number = '29'
选择地址。*,大小写
当邮政编码为“10010”时,则“邮政编码不匹配”
当街道名称为“Elm”时,则为“街道名称不匹配”
当门牌号为“29”时,则“门牌号不匹配”
ELSE“匹配所有元素”
以zip_匹配结束
发件人地址
其中邮政编码='10010'
或街道名称='Elm'
或门牌号='29'

为了清晰起见,我让它返回了一些非常冗长的语句,但很明显,你可以让它返回一个数字代码或任何对你有意义的东西。这也没有考虑像区分大小写这样的问题。正如它所写的,它也在寻找精确的案例匹配。根据您的数据库环境或数据的存储方式,如果您不希望这样做,您可能需要解决这个问题

我认为您可以使用case语句和一些嵌套查询在一个查询中获得解决方案,但在我开始之前,我不确定我是否遵循了您试图实现的目标。假设以下示例数据集:

ID   House_Number    Street_Name   Zip_Code
=============================================
1            3012            Elm      10010
2             412            9th      10010
3             412           Main      90210
4             710           Main      60606
还假设以下方法调用,传入zip、姓名和门牌号:

MatchAddress('10010', 'Main', '710')
在这种情况下你想得到什么?您的签名有一个用于不匹配位置的单独变量,但本例将部分匹配至少一个元素上涉及的所有四个记录。例如,对于记录1,您希望返回什么,其中邮政编码匹配,但房屋号码或街道名称属性不匹配

======================================

好的,看到你的评论了。这里有一个问题,我认为对你来说是正确的。WHERE子句是一系列OR,返回至少符合一个条件的任何记录。然后case语句查看它们与传入值不相等的地方。显然,最不特定的匹配是主观的,但是您可以重新排序case语句,以将所需的匹配条件按您想要的顺序排列。我在MySQL数据库上做了这个

SELECT address.*, CASE 
    WHEN zip_code <> '10010' THEN 'No match on Zip'
    WHEN street_name <> 'Elm' THEN 'No match on Street Name'
    WHEN house_number <> '29' THEN 'No match on House Number'
    ELSE 'Match on all elements'
  END AS zip_match
from address
where zip_code = '10010'
OR street_name = 'Elm'
OR house_number = '29'
选择地址。*,大小写
当邮政编码为“10010”时,则“邮政编码不匹配”
当街道名称为“Elm”时,则为“街道名称不匹配”
当门牌号为“29”时,则“门牌号不匹配”
ELSE“匹配所有元素”
以zip_匹配结束
发件人地址
其中邮政编码='10010'
或街道名称='Elm'
或门牌号='29'

为了清晰起见,我让它返回了一些非常冗长的语句,但很明显,你可以让它返回一个数字代码或任何对你有意义的东西。这也没有考虑像区分大小写这样的问题。正如它所写的,它也在寻找精确的案例匹配。根据您的数据库环境或数据的存储方式,如果您不希望这样做,您可能需要解决这个问题

应按照从不太具体到更具体的顺序进行匹配(即邮政编码、街道名称、房屋号等)。在您的示例中,将返回ID 1和2,并将不匹配位置设置为Street_Name。这里还有一些例子:MatchAddress('10010','Elm','412')-返回ID 1,并将不匹配设置为House_Number。MatchAddress('99999'、'Elm'、'3012')-不返回任何内容,并且不匹配设置为邮政编码。MatchAddress('10010','')-返回ID 1和2,并且没有不匹配(因为没有指定街道名称和邮政编码,所以应该忽略它们)。希望这有助于澄清这一点。我刚刚用一个问题更新了我的答案。试试看。很抱歉延迟回复。我是SO的新成员,我想当你发表评论时我会收到一封电子邮件。看起来正是我想要的。现在,让我们看看是否可以将其转换为Linq2SQL…匹配应该按照从不特定到更特定的顺序进行(即邮政编码、街道名称、房屋号等)。在您的示例中,ID 1和2将是b