Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在.NET中构建对象时评估动态信息_Xml_Linq_Reflection_Linq To Objects_Dynamic Linq - Fatal编程技术网

Xml 在.NET中构建对象时评估动态信息

Xml 在.NET中构建对象时评估动态信息,xml,linq,reflection,linq-to-objects,dynamic-linq,Xml,Linq,Reflection,Linq To Objects,Dynamic Linq,我在生成各种表达式时遇到了一个问题,最终将对这些表达式进行计算,并根据这些表达式的结果或它们的直接结果在创建该类型时应用于目标列/属性 例如: 产品 创建包对象时(equal op的左侧为目标列) 应该在其上形成表达式的整个可比较数据已经缓存在内存中。(即不会发生数据库往返,整个静态查找数据已在内存中可用) 现在的问题是:所有这些决策都是在GUI上做出的(即源列到目标列的映射、基于特定表达式计算的映射,或者将表达式的结果映射到目标列)。因此,我正在准备一个XML,以便以这种方式在字段级别包含整个

我在生成各种表达式时遇到了一个问题,最终将对这些表达式进行计算,并根据这些表达式的结果或它们的直接结果在创建该类型时应用于目标列/属性

例如:

产品

创建包对象时(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可能变得越来越复杂

为此,我正在考虑以下选择:

  • 使用DLINQ创建动态表达式(稍后调用compile)

  • 每个操作都有单独的类(即比较、添加、删除、搜索数据库(获取数据库集 使用反射动态搜索特定属性)

  • 第一个选项比后一个选项更容易构造。因为创建动态表达式可能要容易得多。但由于动态特性,这会慢得多

    第二种选择是使用单独的命令(类)来执行各自的操作,这可能会更快,但会在应用程序中造成更大的复杂性

    我能在这方面有更好的建议吗?接下来应该做什么?
    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>