2013-12-20 36 views
2

我内容部分增加了一个一对一的关系:在控制器我做果园查询加盟实体

OnInitializing<AddResellerPart>(PropertySetHandlers); 
    OnLoaded<AddResellerPart>(LazyLoadHandlers); 
    ... 

现在,如果:

public class AddResellerPart : ContentPart<AddResellerPartRecord> 
{ 

    private readonly LazyField<ResellerPart> _reseller = new LazyField<ResellerPart>(); 

    public LazyField<ResellerPart> ResellerField { get { return _reseller; } } 

    public ResellerPart Reseller 
    { 
     get { return _reseller.Value; } 
     set { _reseller.Value = value; } 
    } 
    ... 

我已经实现了处理器像这样:

var customer = _orchardServices.ContentManager 
        .Query<AddResellerPart, AddResellerPartRecord>() 
        .List().First(); 

var name = customer.Reseller.Description; 

它的作品就像一个魅力!但是,如果我试试这个:

var customer = _orchardServices.ContentManager 
        .Query<AddResellerPart, AddResellerPartRecord>() 
        .Where(x => x.Reseller.Description.Contains(filterDescription)) 
        .List().First(); 

我得到的错误:

"could not resolve property: Reseller.Descriptionof: 
myproject.Core.Models.AddResellerPartRecord" 

我觉得这金正日有关的事实,实体之间的连接是由处理器管理和NHibernate一无所知AddResellerPart和经销商关系。

我也tryied以这种方式来覆盖制图:

public class PersistenceConfiguration : ISessionConfigurationEvents { 

    public void Created(FluentConfiguration cfg, AutoPersistenceModel defaultModel) { 
     defaultModel.Override<AddResellerPart>(mapping => mapping.References(x => x.Reseller, "Reseller_Id")); 
    } 

似乎没有任何改变!

我该如何做到这一点?

+0

你能清理代码吗?看起来好像有一些错误的复制和粘贴:你有AddResellerPart和AddResellerPartPart。 –

+0

对不起,不好剪贴!完成! – danyolgiax

+0

我认为你需要切换到HQL,并从那里明确地加入。 –

回答

3

后,其中我觉得谁抛出蝙蝠翅膀入大锅巫师小时,我设法使它像所有这一切工作:

var query =_orchardServices.ContentManager.HqlQuery() 
     .Join(alias=>alias.ContentPartRecord<AddResellerPartRecord>()); 

var defaultHqlQuery = query as DefaultHqlQuery; 
var fiJoins = typeof(DefaultHqlQuery).GetField("_joins", BindingFlags.Instance | BindingFlags.NonPublic); 
var joins = fiJoins.GetValue(defaultHqlQuery) as List<Tuple<IAlias, Join>>; 
joins.Add(new Tuple<IAlias, Join>(new Alias("myproject.Core.Models"), new Join("ResellerPartRecord", "ResellerAlias", ","))); 
Action<IHqlExpressionFactory> joinOn = predicate => predicate.EqProperty("Id", "addResellerPartRecord.Reseller"); 
query = query.Where(alias => alias.Named("ResellerAlias"), joinOn); 

query = query.Where(alias => alias.Named("ResellerAlias"), predicate => predicate.Like("Description", filterDescription, HqlMatchMode.Anywhere)); 
var users = query.List(); 

现在我猜...这是正确的和“最简单的“方式?

+0

这可能是唯一可行的方法,但是您必须使用反射才能访问私人领域,这很糟糕...请参阅:https://orchard.codeplex.com/discussions/538405 – Piedone