我有一个名为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子句。
还有其他简单的方法来实现这一目标吗?
答案 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并翻阅“入门”维基页面。你会感到惊讶。