我有两种类型的用户来到我的应用程序,这是一种搜索工具,允许用户根据患者的信息搜索医疗记录。
1。医生:他们可以根据patientid
和hospitalid
进行搜索
的 2。警方:他们可以根据patientid
,hospitalid
,firstname
和lastname
进行搜索。
我打算为搜索条件创建一个类,如下所示:
public class searchcriteria
{
int? patientid
int? hospitalid
string firstname
string lastname
}
我应该如何强制执行Patient
用户类型只是初始化两个属性的规则?
这是一个很好的设计,可以将searchcriteria保留在一个类中,还是应该完全独立于Patient
和Police
? (在这种情况下,如果新用户进来,我需要再添加一个类)
答案 0 :(得分:2)
您可以为该类型创建两个不同的构造函数,一个用于两个字段,一个用于所有四个,但这并不能使调用者明白这一点时应该使用它们。通过使用静态工厂方法创建类型的实例来增加更多清晰度:
public class SearchCriteria
{
//prevent construction without using a factory method
private SearchCriteria() { }
public int? PatientId { get; private set; }
public int? HospitalId { get; private set; }
public string FirstName { get; private set; }
public string LastName { get; private set; }
public static SearchCriteria CreatePatientSearch(
int? patendId, int? hospitalId)
{
return new SearchCriteria()
{
PatientId = patendId,
HospitalId = hospitalId
};
}
public static SearchCriteria CreatePoliceSearch(
int? patendId, int? hospitalId,
string firstName, string lastName)
{
return new SearchCriteria()
{
PatientId = patendId,
HospitalId = hospitalId,
FirstName = firstName,
LastName = lastName,
};
}
}
当然,一旦构建了一个对象,我们就不再需要关心它是患者还是警察搜索,我们只是按照有价值的搜索条件行事。 (当这样做时,重要的是每个字段的默认值意味着“不要搜索它”以使其起作用。)
答案 1 :(得分:1)
由于您有医生可用的基本搜索条件,然后是警察的更专业的搜索条件,您可以使用继承:
public class SearchCriteria
{
public SearchCriteria(int patientId, int hospitalId)
{
PatientId = patientId;
HospitalId = hospitalId;
}
public int PatientId {get;set;}
public int HospitalId {get;set;}
}
public class PoliceSearchCriteria : SearchCriteria
{
public PoliceSearchCriteria(int patientId, int hospitalId, string first, string last)
: base(patientId, hospitalId)
{
FirstName = first;
LastName = last;
}
public string FirstName {get;set;}
public string LastName {get;set;}
}
答案 2 :(得分:0)
我认为searchcriteria是一个纯数据类,强制执行这种约束不是它的关注点。
也许您可以创建两个单独的方法来执行搜索,一个用于按patientid
和hospitalid
进行搜索,另一个用于按所有字段进行搜索。将它们放在单独的界面中(例如IRestrictedSearch
和IFullSearch
,或IPhysicianSearch
和IPoliceSearch
),并确保只提供适当的界面,以便执行医生的代码/警察搜查。
答案 3 :(得分:0)
我想了解更多信息以便更好地了解您的问题......
但如果我做对了,你必须要有不同类型的用户,而且每个用户都可以根据不同的标准进行搜索,那可以吗?
这就是我要解决的问题。
(Default.aspx.vb的代码)
Protected Sub btnSearch_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSearch.Click
Dim sRol As String = Roles.GetRolesForUser.Single()
Dim sUser As String = User.Identity.Name
If sRol = "Phyisician" Then
Dim searchUrl As String = "search.aspx?searchprm=" & searchTB.Text & "susrrol=1"
Response.Redirect(searchUrl)
End If
If sRol = "Police" Then
Dim searchUrl As String = "search.aspx?searchprm=" & searchTB.Text & "susrrol=2"
Response.Redirect(searchUrl)
End If
End Sub
然后,在搜索结果页面上,我将使用不同的SQL存储过程处理代码:
(search.aspx.vb)
Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
Dim sRol As String = Roles.GetRolesForUser.Single()
Dim sUser As String = User.Identity.Name
If sRol = "Phyisician" Then
Dim searchUrl As String = "search.aspx?searchprm=" & searchTB.Text & "susrrol=1"
Response.Redirect(searchUrl)
End If
If sRol = "Police" Then
Dim searchUrl As String = "search.aspx?searchprm=" & searchTB.Text & "susrrol=2"
Response.Redirect(searchUrl)
End If
Dim prm As String = Request.QueryString("searchprm").ToString
Dim rus As String = Request.QueryString("susrrol").ToString
If rus = 1 Then
Dim CountResults As String
Dim strConn1 As String = ConfigurationManager.ConnectionStrings("YourConnection").ToString
Dim cmd1 As New SqlCommand("SEL_COUNT_Hits_Rol1", New SqlConnection(strConn1))
cmd1.CommandType = CommandType.StoredProcedure
cmd1.Connection.Open()
Dim sP1 As New SqlParameter("@search", SqlDbType.VarChar)
sP1.Direction = ParameterDirection.Input
sP1.Value = prm
cmd1.Parameters.Add(sP1)
CountResults = String.Format("{0:##,###.##}", cmd1.ExecuteScalar())
cmd1.Connection.Close()
lblHits.Text = "<i>We have found " & CountResults & " patients who match your search terms:" & "</i>"
End If
If rus = 2 Then
Dim CountResults As String
Dim strConn1 As String = ConfigurationManager.ConnectionStrings("YourConnection").ToString
Dim cmd1 As New SqlCommand("SEL_COUNT_Hits_Rol2", New SqlConnection(strConn1))
cmd1.CommandType = CommandType.StoredProcedure
cmd1.Connection.Open()
Dim sP1 As New SqlParameter("@search", SqlDbType.VarChar)
sP1.Direction = ParameterDirection.Input
sP1.Value = prm
cmd1.Parameters.Add(sP1)
CountResults = String.Format("{0:##,###.##}", cmd1.ExecuteScalar())
cmd1.Connection.Close()
lblHits.Text = "<i>We have found " & CountResults & " patients who match your search terms:" & "</i>"
End If
End Sub
然后,在前面的代码中,我将使用找到的日期绑定gridview。可能SQL查询会是这样的(对于rol 1 - 医生):
SELECT COUNT(*) FROM [dbo].[Patients] WHERE([PId] = @prm)
对于gridview:
SELECT * FROM [dbo].[Patients] WHERE([PId] = @prm) ORDER BY [PId] ASC
警察(第2卷):
SELECT COUNT(*) FROM [dbo].[Patients] WHERE(FREETEXT(*, @prm))
和
SELECT * FROM [dbo].[Patients] WHERE(FREETEXT(*, @prm)) ORDER BY [PId] ASC
我希望这能为你提供一些如何解决这个问题的线索。