多数据库搜索方法重载

时间:2018-01-18 15:30:06

标签: c# sql-server database oop

我有一个名为Member

的课程
class Member
{
    // properties to set values
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string Surname { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string Address3 { get; set; }
    public string PostCode { get; set; }
    public string ContactNumber { get; set; }
    public AccountType accountType;

    public static bool AddNewMember(Member newMember)
    {
        // Code to add member to database here
    }

    public static List<Member> GetAllMembers()
    {
       // code to return all members from the database
       // SQL QUERY: SELECT * FROM Member
    }

    public static List<Member> FindMember(int memberId)
    {
       // code to find member(s) with the member Id
       // SQL QUERY: SELECT * FROM Member WHERE MemberId = memberId
    }

    public static List<Member> FindMember(string memberSurname)
    {
        // code to find members in the database with the given surname
        // SQL QUERY: SELECT * FROM Member WHERE AccountHoldersurname = memberSurname
    }

并且成员存储在以下数据库表中:

CREATE TABLE Member
(
       MemberID                     INT IDENTITY(1,1)            PRIMARY KEY,
       AccountTypeID                INT FOREIGN KEY REFERENCES AccountTypes (AccountTypeID),
       AccountHolderFirstName       VARCHAR(50),
       AccountHolderSurname         VARCHAR(50),
       AccountHolderAddress1        VARCHAR(50),
       AccountHolderAddress2        VARCHAR(50),
       AccountHolderAddress3        VARCHAR(50),
       AccountHolderPostcode        VARCHAR(10),
       AccountHolderContactNo       VARCHAR(12)
)

我想要做的是允许返回符合给定条件的成员列表。

目前有两个FindMember方法重载,允许成员被memberId或firstName搜索。

但是,我希望成员可以通过任何属性进行搜索。所以这意味着为每个属性添加另一个重载:

public static List<Member> FindMember(string memberFirstname)
{
    // code to find members in the database with the given firstname
}

但是,由于已经有一个具有相同签名的方法重载,我不能这样做。

另外,我想允许会员可以通过多个参数进行搜索,包括EG名字和姓氏,或者地址1和姓氏。

我可以通过创建一个搜索方法来实现第一个要求(可以通过每个参数搜索):

public static List<Member> FindMember(string parameterToSearch, string value)
{
    // code to find members in the database with the given surname
}

但这可能意味着在SQL中动态构建WHERE子句。

还有其他简单的方法来实现这一目标吗?

3 个答案:

答案 0 :(得分:1)

我建议使用单一搜索方法,而不是每种组合使用一种搜索方法。传入每个属性的可空参数。然后,您需要做的就是将这些值发送到catch所有类型的过程,然后就完成了。

这是一篇关于如何构建此类查询的优秀文章。

http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

答案 1 :(得分:0)

  

我希望成员可以通过任何属性进行搜索。   所以这意味着为每个属性添加另一个重载

你做不到。使用方法的签名完成重载。如果两个方法的签名相同,则代码将无法编译。

  

还有其他简单的方法来实现这一目标吗?

为您要使用的每个搜索谓词创建一个方法。 将谓词组合到clouse(动态与否应该决定)并执行操作。

答案 2 :(得分:0)

首先,创建一个新的枚举。

public enum FieldName 
{
    AccountHolderFirstName,
    AccountHolderSurname,
    AccountHolderAddress1,
    AccountHolderAddress2,
    AccountHolderAddress3,
    AccountHolderPostcode,
    AccountHolderContactNo
}

然后创建一个新类(实际上一个结构会做,但到底是什么)。

public class SearchCriteria
{
    public FieldName Key {get;set;}
    public string Value {get;set;}
}

然后修改你的班级代码。

public static List<Member> FindMember(SearchCriteria criteria)
{
    // code to find members in the database with the given criteria
    // SQL QUERY: "SELECT * FROM Member WHERE [" + criteria.Key.ToString() + "] = '" + criteria.Value + "';"
}

这很容易。

但是,可怕的做法。实际上,您应该将所有数据库代码提取到存储库,通过$ {{您首选的DI容器}}注入它并在适当的方法中调用它。

查看Insight.Database并翻阅“入门”维基页面。你会感到惊讶。