2013-08-05 102 views
1

我已經搜索並嘗試了一些不同的方法來做到這一點與LINQ/NHibernate,並沒有得到任何工作。FluentNHibernate.QueryOver.Join.Where()無法確定成員類型從

我想從我的數據中獲取沒有BolContainer的REF字段。我一直得到這個錯誤: 「無法確定bc的成員類型」 或回收所有REF字段,無論他們是否擁有BolContainer。

數據庫

CREATE TABLE dbo.REF( 標識BIGINT PRIMARY KEY IDENTITY(1,1)NOT NULL, HL_Id BIGINT參考文獻HL(同上)NOT NULL, ElementOrder SMALLINT NOT NULL, Element01 VARCHAR(3)NOT NULL, Element02 VARCHAR(30)NOT NULL, Element03 VARCHAR(80)NULL )

CREATE TABLE dbo.BolContainer( 標識BIGINT PRIMARY KEY IDENTITY( 1,1)NOT NULL, BSN_Id BIGINT唯一的參考號BSN(同上)NOT NULL, REF_ID BIGINT唯一的參考號REF(同上)NOT NULL, ErrorID中BIGINT值誤差(同上)NULL, 拒絕BIT NULL, 完整比特的空, 刪除BIT NULL )

實體

public class REF : EdiEntity 
{ 
    public virtual short Order { get; set; } 
    public virtual string Element01 { get; set; } 
    public virtual string Element02 { get; set; } 
    public virtual string Element03 { get; set; } 

    public virtual HL HL { get; set; } 

    public virtual BolContainer BolContainer { get; set; } 
} 
public class BolContainer : Entity 
{ 
    public virtual bool? Rejected { get; set; } 
    public virtual bool? Complete { get; set; } 
    public virtual bool? Deleted { get; set; } 

    public virtual BSN BSN { get; set; } 

    public virtual REF REF { get; set; } 

    public virtual Error Error { get; set; } 

    public virtual void AddBSN(BSN bsn) 
    { 
     bsn.BolContainer = this; 
     BSN = bsn; 
    } 

    public virtual void AddREF(REF r) 
    { 
     r.BolContainer = this; 
     REF = r; 
    } 

    public virtual void AddError(Error error) 
    { 
     error.BolContainers.Add(this); 
     Error = error; 
    } 
} 

映射

public class REFMap : ClassMap<REF> 
{ 

    public REFMap() 
    { 
     Id(x => x.Id); 
     References(x => x.HL, "HL_Id"); 
     Map(x => x.Order, "ElementOrder"); 
     Map(x => x.Element01); 
     Map(x => x.Element02); 
     Map(x => x.Element03); 

     HasOne(x => x.BolContainer) 
      .Cascade.All() 
      .Not.LazyLoad() 
      .Fetch.Join(); 
    } 

} 

public class BolContainerMap : ClassMap<BolContainer> 
{ 

    public BolContainerMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Rejected).Nullable(); 
     Map(x => x.Complete).Nullable(); 
     Map(x => x.Deleted).Nullable(); 

     References(x => x.BSN, "BSN_Id") 
      .Cascade.All(); 

     References(x => x.REF, "REF_Id") 
      .Cascade.All() 
      .Not.LazyLoad() 
      .Fetch.Join(); 

     References(x => x.Error, "ErrorId") 
      .Cascade.All() 
      .Nullable(); 
    } 

} 

這是我的功能與一些我的各種徒勞的嘗試:

public IList<REF> GetUnprocessedBols() 
    { 
      ISession DbSession = SessionFactory.OpenSession(); 

      //var x = from REF r in DbSession.Query<REF>() 
      //  where r.Element01 == "MB" && r.BolContainer != null 
      //  select r; 

      //return x.ToList<REF>(); 

      //return DbSession.CreateCriteria<REF>() 
      //  .Add(Restrictions.Where<REF>(r => r.Element01 == "MB")) 
      //  //.Add(Restrictions.Where<REF>(r => r.BolContainer == null)) 
      //  .List<REF>(); 

      //REF bolAlias = null; 
      //BolContainer bolContainerAlias = null; 

      //var result = DbSession 
      //  .QueryOver<REF>(() => bolAlias) 
      //  .Where(r => r.Element01 == "MB") 
      //  .WithSubquery 
      //  .WhereNotExists<BolContainer>(
      //   QueryOver.Of<BolContainer>(() => bolContainerAlias) 
      //   .Where(() => bolAlias.BolContainer == null) 
      //   .Select(x => x.REF) 
      //  ); 

      //return result.List(); 

      //return DbSession 
      //  .QueryOver<BolContainer>() 
      //  .Right.JoinQueryOver(x => x.REF) 
      //  .Where(r => r.Element01 == "MB") 
      //  .Where(r => r.BolContainer == null) 
      //  .Select(bc => bc.REF) 
      //  .List<REF>(); 

      return DbSession 
        .QueryOver<REF>() 
        .Where(r => r.Element01 == "MB") 
        .Left.JoinQueryOver(x => x.BolContainer) 
        .Where(bc => bc == null) 
        .List(); 
    } 

我想最讓底部有一個工作,但會滿足於任何人。

我寧願不求助於HQL,或者之後過濾列表,但我不確定是否可以使其工作。

感謝您的幫助, 傑夫

回答

1

固執地用不同的方法我試過玩弄後,我終於得到了一個工作。

  REF bolAlias = null; 
      BolContainer bolContainerAlias = null; 

      var result = DbSession 
        .QueryOver<REF>(() => bolAlias) 
        .Where(r => r.Element01 == "MB") 
        .WithSubquery 
        .WhereNotExists<BolContainer>(
         QueryOver.Of<BolContainer>(() => bolContainerAlias) 
         .Where(() => bolAlias.Id == bolContainerAlias.REF.Id) 
         .Select(x => x.REF) 
        ); 

      return result.List(); 

它不回答「無法確定成員類型」問題,但它確實解決了問題。也許答案可以幫助某人或至少提供一個例子。

相關問題