Xml 在.NET中构建对象时评估动态信息
我在生成各种表达式时遇到了一个问题,最终将对这些表达式进行计算,并根据这些表达式的结果或它们的直接结果在创建该类型时应用于目标列/属性 例如: 产品 创建包对象时(equal op的左侧为目标列) 应该在其上形成表达式的整个可比较数据已经缓存在内存中。(即不会发生数据库往返,整个静态查找数据已在内存中可用) 现在的问题是:所有这些决策都是在GUI上做出的(即源列到目标列的映射、基于特定表达式计算的映射,或者将表达式的结果映射到目标列)。因此,我正在准备一个XML,以便以这种方式在字段级别包含整个信息Xml 在.NET中构建对象时评估动态信息,xml,linq,reflection,linq-to-objects,dynamic-linq,Xml,Linq,Reflection,Linq To Objects,Dynamic Linq,我在生成各种表达式时遇到了一个问题,最终将对这些表达式进行计算,并根据这些表达式的结果或它们的直接结果在创建该类型时应用于目标列/属性 例如: 产品 创建包对象时(equal op的左侧为目标列) 应该在其上形成表达式的整个可比较数据已经缓存在内存中。(即不会发生数据库往返,整个静态查找数据已在内存中可用) 现在的问题是:所有这些决策都是在GUI上做出的(即源列到目标列的映射、基于特定表达式计算的映射,或者将表达式的结果映射到目标列)。因此,我正在准备一个XML,以便以这种方式在字段级别包含整个
<Mapping>
<Field TargetField="CountryGroup" >
<Rule>
<Compare pram1="Versandart" param2="24" >
<True Result="2"/>
<False Result="1"/>
</Compare>
</Rule>
</Field>
<Field TargetField="UnLoadingCountryId" >
<Rule>
<Compare param1="Versendart" param="24">
<True ResultType ="CallToDB" TableName="Country" SourceCol="Iso" TargetCol="ELKZ" TargetValueColumn="CountryId"/>
<False ResultType ="ScalerValue" value="94"/>
</Compare> <!-- targetting expression was : bell.Versandart == "24" ? Countries.SingleOrDefault(pr => pr.Iso == bell.ELKZ.Left(2))?.CountryId : 94,-->
</Rule>
</Field>
<Field TargetField="CostCenter" >
<Rule>
<IsNullOrEmpty param1="Kundengruppe">
<True ResultType ="ScalerValue" value="S"/>
<False ResultType ="SelfAssignment" value="Kundengruppe"/>
</Compare>
</Rule>
</Field>
<Field TargetField="TODId" >
<Rule>
<IsNullOrEmpty param1="Versandstelle" param2="1031">
<True ResultType ="CallToDB" TableName="Tod" search="Border" TargetValueColumn="TodId"/>
<True ResultType ="CallToDB" TableName="Tod" search="Delivered" TargetValueColumn="TodId"/>
<!-- targetting expression was : Versandstelle == "1031" ? 1028 : 1027 -->
</Compare>
</Rule>
</Field>
我现在不知道这个xml结构有多好,以及它如何始终存储动态读取和应用的每个信息。此外,由于嵌套表达式或基于表达式结果的多种操作,这种xml可能变得越来越复杂
为此,我正在考虑以下选择:
Xml结构需要改进?我认为您应该对词汇语言进行更多的研究。我将从旧的Unix YACC(另一种编译器)开始还有Unix方法Lex。请看:我确信人们已经在.NET中创建了几种计算表达式的方法。我不关心计算。我关心的是速度和可维护性方面的最佳方法。这就是我推荐YACC的原因。YACC是由编程科学家和贝尔实验室在20世纪70年代初开发的当计算机运行速度比今天慢的时候,算法的速度很重要。我在寻找一些东西,而不是编译器语言的构建或语言的形成。我确信,一些东西可以在保持不变的情况下实现。我不是说使用YACC。只是说使用类似于YACC的数据定义。
<Mapping>
<Field TargetField="CountryGroup" >
<Rule>
<Compare pram1="Versandart" param2="24" >
<True Result="2"/>
<False Result="1"/>
</Compare>
</Rule>
</Field>
<Field TargetField="UnLoadingCountryId" >
<Rule>
<Compare param1="Versendart" param="24">
<True ResultType ="CallToDB" TableName="Country" SourceCol="Iso" TargetCol="ELKZ" TargetValueColumn="CountryId"/>
<False ResultType ="ScalerValue" value="94"/>
</Compare> <!-- targetting expression was : bell.Versandart == "24" ? Countries.SingleOrDefault(pr => pr.Iso == bell.ELKZ.Left(2))?.CountryId : 94,-->
</Rule>
</Field>
<Field TargetField="CostCenter" >
<Rule>
<IsNullOrEmpty param1="Kundengruppe">
<True ResultType ="ScalerValue" value="S"/>
<False ResultType ="SelfAssignment" value="Kundengruppe"/>
</Compare>
</Rule>
</Field>
<Field TargetField="TODId" >
<Rule>
<IsNullOrEmpty param1="Versandstelle" param2="1031">
<True ResultType ="CallToDB" TableName="Tod" search="Border" TargetValueColumn="TodId"/>
<True ResultType ="CallToDB" TableName="Tod" search="Delivered" TargetValueColumn="TodId"/>
<!-- targetting expression was : Versandstelle == "1031" ? 1028 : 1027 -->
</Compare>
</Rule>
</Field>