我是否应该将Linq语句放入对象属性中?这是一种最佳做法还是一种否定?另外,如果可以的话,我应该在哪里用这个划线呢?我认为数据库访问可能太远了,但是是有一行,还是只有一个灰色区域?你看到我使用Linq有什么问题吗?
[XmlRoot("message")]
public class Message
{
[XmlAttribute]
public string type { get; set; }
[XmlElement("segment")]
public Segment[] segments { get;set; }
[XmlElement("group")]
public Group[] groups { get; set; }
[XmlElement("field")]
public Field[] Issues { get; set; }`public Field[] Issues { get; set; }
public bool HasNoIssues
{
get
{
return Issues == null || Issues.Length == 0;
}
}
public bool HasWarnings
{
get
{
if (!HasNoIssues)
return Issues.Where(x => x.name == "Warnings").Count() > 0;
return false;
}
}
public bool HasErrors
{
get
{
if (!HasNoIssues)
return Issues.Where(x => x.name == "Errors").Count() > 0;
return false;
}
}
public ResponseTags[] Warnings
{
get
{
if (HasWarnings)
return Issues.Where(x => x.name == "Warnings").First().groups.First().warnings;
return new ResponseTags[0];
}
}
public ResponseTags[] Errors
{
get
{
if (HasErrors)
return Issues.Where(x => x.name == "Errors").First().groups.First().warnings;
return new ResponseTags[0];
}
}
public string DisplayWarnings
{
get
{
var warningString = "";
if (HasWarnings)
{
warningString += Issues.Where(x => x.name == "Warnings").First().groups.First().warnings.Aggregate("", (data, t) => data + t.value +"\n");
}
return warningString;
}
}
public string DisplayErrors
{
get
{
var errorString = "";
if (HasErrors)
{
errorString += Issues.Where(x => x.name == "Errors").First().groups.First().errors.Aggregate("", (data, t) => data + t.value+"\n");
}
return errorString;
}
}}
[Serializable]
public class Segment
{
[XmlAttribute]
public string type { get; set; }
[XmlElement("field")]
public Field[] fields { get; set; }
}
[Serializable]
public class Group
{
[XmlAttribute]
public string type { get; set; }
[XmlElement("segment")]
public Segment[] segments { get; set; }
[XmlElement("e")]
public ResponseTags[] errors { get; set; }
[XmlElement("w")]
public ResponseTags[] warnings { get; set; }
[XmlElement("i")]
public ResponseTags[] informations { get; set; }
}
[Serializable]
public class Field
{
[XmlAttribute]
public string name { get; set; }
[XmlText]
public string value { get; set; }
[XmlElement("datatype")]
public DataType datatype { get; set; }
[XmlElement("group")]
public Group[] groups { get; set; }
}
[Serializable]
public class DataType
{
[XmlAttribute]
public string type { get; set; }
[XmlElement("field")]
public Field[] fields { get; set; }
}
[Serializable]
public class ResponseTags
{
[XmlAttribute]
public string value { get; set; }
[XmlAttribute]
public string path { get; set; }
[XmlAttribute]
public string type { get; set; }
[XmlAttribute]
public string HL7ErrorCode { get; set; }
[XmlAttribute]
public string HL7ErrorCodeFullDescription { get; set; }
[XmlAttribute]
public string SegmentID { get; set; }
[XmlAttribute]
public string FieldPosition { get;set;}
[XmlAttribute]
public string FieldRepetition { get; set; }
[XmlAttribute]
public string ComponentNumber { get; set;}
[XmlAttribute]
public string SubComponentNumber { get; set;}
[XmlAttribute]
public string Severity { get; set; }
}然后,该对象将被一些xml反序列化填充。
private Message getMessage(string xml)
{
if (xml.Length == 0)
return new Message();
XmlSerializer serial = new XmlSerializer(typeof(Message));
MemoryStream soapwriter = new MemoryStream(Encoding.UTF8.GetBytes(xml));
return (Message)serial.Deserialize(soapwriter);
}这里有一些测试xml,这里没有真正的数据,我已经把它刮掉了。
<message xmlns="" type="VxuV04">
<segment type="msh">
<field name="MSH-1 (FieldSeperator)">
<![CDATA[ | ]]>
</field>
<field name="MSH-2 (EncodingCharacters)">
<![CDATA[ ^~\& ]]>
</field>
<field name="MSH-3 (SendingApplication)">
<datatype type="hd">
<field name="NamespaceID">OMG IMMUNIZATIO</field>
<field name="UniversalID"/>
<field name="UniversalIDType"/>
</datatype>
</field>
<field name="MSH-4 (SendingFacility)">
<datatype type="hd">
<field name="NamespaceID">FF0000</field>
<field name="UniversalID"/>
<field name="UniversalIDType"/>
</datatype>
</field>
<field name="MSH-5 (ReceivingApplication)">
<datatype type="hd">
<field name="NamespaceID">AK TEST FACILITY</field>
<field name="UniversalID"/>
<field name="UniversalIDType"/>
</datatype>
</field>
<field name="MSH-6 (ReceivingFacility)">
<datatype type="hd">
<field name="NamespaceID">ML1001</field>
<field name="UniversalID"/>
<field name="UniversalIDType"/>
<group type="ProblemCollection">
<e value="Invalid value: ML1001. Reason: No user assigned to this facility." path="MSH/ReceivingFacility/NamespaceID" type="problem" HL7ErrorCode="103" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Msh" SegmentSequence="" FieldPosition="6" FieldRepetition="1" ComponentNumber="" SubComponentNumber="" Severity="E"/>
</group>
</datatype>
</field>
<field name="MSH-7 (DateTimeOfMessage)">3/28/2014</field>
<field name="MSH-9 (MessageType)">
<datatype type="msg">
<field name="MessageCode">VXU</field>
<field name="TriggerEvent">V04</field>
<field name="MessageStructure">VXU_V04</field>
</datatype>
</field>
<field name="MSH-10 (MessageControlID)">dsfg00541680</field>
<field name="MSH-11 (ProcessingID)">
<datatype type="processingtype">
<field name="ProcessingID">P</field>
<field name="ProcessingMode"/>
</datatype>
</field>
<field name="MSH-12 (HL7Version)">2.5.1</field>
<field name="MSH-15 (AcceptAcknowledgmentType)"/>
<field name="MSH-16 (ApplicationAcknowledgmentType)"/>
<field name="MSH-21 (MessageProfileIdentifier)">
<datatype type="ei">
<field name="EntityIdentifier"/>
<field name="NamespaceID"/>
<field name="UniversalID"/>
<field name="UniversalIDType"/>
</datatype>
</field>
<field name="MSH-22 (ResponsibleSendingOrganization)">
<datatype type="xon">
<field name="OrganizationName"/>
<field name="OrganizationNameTypeCode"/>
<field name="AssigningAuthority">
<datatype type="hd">
<field name="NamespaceID"/>
<field name="UniversalID"/>
<field name="UniversalIDType"/>
</datatype>
</field>
<field name="IdentifierTypeCode"/>
<field name="AssigningFacility">
<datatype type="hd">
<field name="NamespaceID"/>
<field name="UniversalID"/>
<field name="UniversalIDType"/>
</datatype>
</field>
<field name="OrganizationIdentifier"/>
</datatype>
</field>
<field name="MSH-23 (ResponsibleReceivingOrganization)">
<datatype type="xon">
<field name="OrganizationName"/>
<field name="OrganizationNameTypeCode"/>
<field name="AssigningAuthority">
<datatype type="hd">
<field name="NamespaceID"/>
<field name="UniversalID"/>
<field name="UniversalIDType"/>
</datatype>
</field>
<field name="IdentifierTypeCode"/>
<field name="AssigningFacility">
<datatype type="hd">
<field name="NamespaceID"/>
<field name="UniversalID"/>
<field name="UniversalIDType"/>
</datatype>
</field>
<field name="OrganizationIdentifier"/>
</datatype>
</field>
<field name="Errors">
<group type="ProblemCollection">
<e value="MSH-6 (ReceivingFacility) : Invalid value: zz1001. Reason: No user assigned to this facility." path="MSH/ReceivingFacility/NamespaceID" type="problem" HL7ErrorCode="z3" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Msh" SegmentSequence="" FieldPosition="6" FieldRepetition="1" ComponentNumber="" SubComponentNumber="" Severity="E"/>
</group>
</field>
</segment>
<field name="Errors">
<group type="ProblemCollection">
<e value="MSH-6 (ReceivingFacility) : Invalid value: ML1001. Reason: No user assigned to this facility." path="MSH/ReceivingFacility/NamespaceID" type="problem" HL7ErrorCode="zzz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Msh" SegmentSequence="" FieldPosition="6" FieldRepetition="1" ComponentNumber="" SubComponentNumber="" Severity="E"/>
</group>
</field>
<field name="Warnings">
<group type="ProblemCollection">
<w value="PID-11 (PatientAddress)-Mailing : County Code is not in the list of known county codes ." path="PID/PatientAddress" type="problem" HL7ErrorCode="zzz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Pid" SegmentSequence="" FieldPosition="11" FieldRepetition="" ComponentNumber="" SubComponentNumber="" Severity="W"/>
<w value="PID-11 (PatientAddress)-Physical : County Code is not in the list of known county codes ." path="PID/PatientAddress" type="problem" HL7ErrorCode="zzz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Pid" SegmentSequence="" FieldPosition="11" FieldRepetition="" ComponentNumber="" SubComponentNumber="" Severity="W"/>
</group>
</field>
<field name="ErrorsAndWarningsCombined">
<group type="ProblemCollection">
<e value="MSH-6 (ReceivingFacility) : Invalid value: ML1001. Reason: No user assigned to this facility." path="MSH/ReceivingFacility/NamespaceID" type="problem" HL7ErrorCode="zz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Msh" SegmentSequence="" FieldPosition="6" FieldRepetition="1" ComponentNumber="" SubComponentNumber="" Severity="E"/>
<w value="PID-11 (PatientAddress)-Mailing : County Code is not in the list of known county codes" path="PID/PatientAddress" type="problem" HL7ErrorCode="zz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Pid" SegmentSequence="" FieldPosition="11" FieldRepetition="" ComponentNumber="" SubComponentNumber="" Severity="W"/>
<w value="PID-11 (PatientAddress)-Physical : County Code is not in the list of known county codes ." path="PID/PatientAddress" type="problem" HL7ErrorCode="zzz" HL7ErrorCodeFullDescription="Table value not found" SegmentID="Pid" SegmentSequence="" FieldPosition="z" FieldRepetition="" ComponentNumber="" SubComponentNumber="" Severity="W"/>
</group>
</field>
</message>我保证闭幕词标签在那里
发布于 2014-07-31 17:50:02
我认为大多数事情都是这样说的,我重复并添加了我自己的一些东西:
Any而不是Where + Count。我想它应该有更好的表现。HasNoIssues,HasWarnings和HasErrorsIssues.Where(x => x.Name == "Warnings").First()与Issues.First(x => x.Name == "Warnings")相同所以在我的方法中是这样的:
public Field[] Issues { get; set; }
public bool HasErrors
{
get
{
if (HasIssues)
{
return Issues.Any(x => x.Name == "Errors");
}
return false;
}
}
public bool HasIssues
{
get
{
return Issues != null && Issues.Length > 0;
}
}
public bool HasWarnings
{
get
{
if (HasIssues)
{
return Issues.Any(x => x.Name == "Warnings");
}
return false;
}
}
public ResponseTags[] GetErrors()
{
if (HasErrors)
{
return Issues.First(x => x.Name == "Errors").Groups.First().Warnings;
}
return new ResponseTags[0];
}
public ResponseTags[] GetWarnings()
{
if (HasWarnings)
{
return Issues.First(x => x.Name == "Warnings").Groups.First().Warnings;
}
return new ResponseTags[0];
}
// For the display functions:
// I don't understand why you only usses the first
// groups of errors and warnings, but that may be a requirement.
public string GetErrorsDisplayData()
{
var errorString = "";
if (HasErrors)
{
errorString += Issues.First(x => x.Name == "Errors")
.Groups.First()
.Errors.Aggregate("", (data, t) => data + t.Value + "\n");
}
return errorString;
}
public string GetWarningsDisplayData()
{
var warningString = "";
if (HasWarnings)
{
warningString += Issues.First(x => x.Name == "Warnings")
.Groups.First()
.Warnings.Aggregate("", (data, t) => data + t.Value + "\n");
}
return warningString;
}发布于 2014-07-31 17:01:31
方法Set和Get属性通过它们的Get和Set方法,因此对get和set方法中的属性执行操作并不是一个好主意。
您应该使用object方法来完成这个任务。
公共字符串DisplayErrors { get { var errorString = "";if (HasErrors) { errorString += Issues.Where(x => x.name == Issues.Where ( data,t) => data+t.value+“n”);}返回errorString;}
应该是这样
public string DisplayErrors (bool inputBoolean)
{
var errorString = "";
if (inputBoolean)
{
errorString += Issues.Where(x => x.name == "Errors").First().groups.First().errors.Aggregate("", (data, t) => data + t.value+"\n");
}
return errorString;
}
Console.WriteLine(DisplayErrors(HasErrors));DisplayErrors对我来说是一个动作,所以它应该是对象执行的方法,而不是对象的属性,
查看HasWarnings属性中的内容。布尔属性应该是设置为true或false的对象标志,对象中的方法可以获取或设置标志(为true或false),也可以是与对象交互的对象可见的标志。
所有这些都让我思考整个代码,如果我创建一个新的对象,所有这些属性都指向其他属性,没有设置任何设置。
Warnings属性查看HasWarnings属性,该属性反过来查看HasNoIssues属性(实际上应该类似于HasIssues),在一个名为Issues的类中,它有问题。
这不是一个完整的工人阶级,如果你进一步发展它,你就会发现这根本不是一个好的设计。
HasWarnings应该是一个属性,但是它不应该寻找另一个属性来获得它的值。
需要有一个构造函数来设置基本属性,这就是您所说的
if (HasIssues) {
HasWarnings = Issues.Where(x => x.name == "Warnings").Count() > 0;
} else {
HasWarnings = false;
}发布于 2014-08-01 08:49:39
考虑到Issues是一个固定大小的数组,我个人会考虑缓存结果(除非Issues或Issues中的东西会比调用属性的变化更多)。
尽管如果您的类被反序列化填充,并且它不应该被更改(就像我假设它被命名为类名一样),我还是想通过将所有的setter设置为私有/受保护来使其公开不变。这将带来额外的好处,这意味着您可以在反序列化点评估属性,而不必从属性内部查询数组。
https://codereview.stackexchange.com/questions/58667
复制相似问题