代码之家  ›  专栏  ›  技术社区  ›  dariol

无映射连接

  •  3
  • dariol  · 技术社区  · 17 年前

    是否可以在两个类之间不指定映射的情况下联接它们(使用标准API)?

    我必须加入两个类并从这两个类中检索数据,但无法映射它们。我只知道外带钥匙 某物 在第一类和主键中 身份证件 其次。

    如何创建条件来加入它们?没有地图是可能的吗?

    求你了,救命,我真的很需要它,但我被困住了。:

    聚苯乙烯

    我知道“任意”映射,但我有10个类似someid的字段。为10个字段创建任何映射(仅用于创建联接)都是多余的。 如果没有别的解决办法,我会做的,但我不想做。

    2 回复  |  直到 13 年前
        1
  •  6
  •   mookid8000    17 年前

    我不知道标准版本,但是在HQL中,您可以这样做:

    select customer, order from Customer customer, Order order 
        where order.CustomerID = customer.Id
        and customer.Id = 42
    

    然后,结果集将是一个对象[]的列表,在该列表中,客户将被重复其所下的订单数(当然,假设有一个客户对多个订单)。

    请注意,如果没有任何命令,结果将为空。

        2
  •  1
  •   Cagatay Kalan    13 年前

    如果您不想或不能在实体中定义关联属性(例如在支持插件动态加载的模块化应用程序中),您仍然可以使用Fluent API创建“假”关联。

    请参见Orchard源代码“ContentItemChanging”类。在Orchard中,ContentItem实体希望与存储在不同表中的ContentPart记录相结合。每个ContentPart类型都由模块提供,这意味着更改ContentItem的源并为每个新的部件记录添加关联是困难的(可能不是首选)。

    这是我从果园获得的确切代码:

    /// <summary>
        /// Add a "fake" column to the automapping record so that the column can be
        /// referenced when building joins accross content item record tables.
        /// <typeparam name="TItemRecord">Either ContentItemRecord or ContentItemVersionRecord</typeparam>
        /// <typeparam name="TPartRecord">A part record (deriving from TItemRecord)</typeparam>
        /// </summary>
        class Alteration<TItemRecord, TPartRecord> : IAlteration<TItemRecord> {
            public void Override(AutoMapping<TItemRecord> mapping) {
    
                // public TPartRecord TPartRecord {get;set;}
                var name = typeof(TPartRecord).Name;
                var dynamicMethod = new DynamicMethod(name, typeof(TPartRecord), null, typeof(TItemRecord));
                var syntheticMethod = new SyntheticMethodInfo(dynamicMethod, typeof(TItemRecord));
                var syntheticProperty = new SyntheticPropertyInfo(syntheticMethod);
    
                // record => record.TPartRecord
                var parameter = Expression.Parameter(typeof(TItemRecord), "record");
                var syntheticExpression = (Expression<Func<TItemRecord, TPartRecord>>)Expression.Lambda(
                    typeof(Func<TItemRecord, TPartRecord>),
                    Expression.Property(parameter, syntheticProperty),
                    parameter);
    
                mapping.References(syntheticExpression)
                    .Access.NoOp()
                    .Column("Id")
                    .ForeignKey("none") // prevent foreign key constraint from ContentItem(Version)Record to TPartRecord
                    .Unique()
                    .Not.Insert()
                    .Not.Update()
                    .Cascade.All();
            }
        }
    

    此代码只是向ContentItem添加一个“部分”关联,使您能够在标准中使用联接。例如,如果有一个名为“productpart”的部件存储在一个名为“productpartrecord”的表中,那么您可以在伪属性“productpartrecord”上加入ContentItem。

    顺便说一句,这种策略似乎也可以应用于假关系的很多方面,但我想你必须定制流畅的来源。