我已經搜索並嘗試了一些不同的方法來做到這一點與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,或者之後過濾列表,但我不確定是否可以使其工作。
感謝您的幫助, 傑夫