2012-07-08 267 views
2

我有一個與NHibernate的asp.net mvc應用程序,我不知道如何解決一個問題來查詢一些數據。我有這個疑問:無法解析屬性(複雜屬性)

// create query 
var query = session.QueryOVer<Laudo>().Fetch(x => x.Equipament).Eager; 

// add some filters 
if (idEquipament.HasValue) 
    query = query.And(x => x.Equipament.Id == idEquipament.Value); 

//I got the error here... 
if (idCompany.HasValue) 
    query = query.And(x => x.Equipament.Company.Id == idCompany.Value); 

當我嘗試執行此查詢,我已經得到了這個消息的異常: 「無法解析屬性:的Equipament.Company.Id:DomainModel.Laudo

我能做些什麼來解決這個問題? 謝謝

回答

2

你不能使用這樣的另一個實體屬性。 NHibernate期望表達式可以被評估爲當前實體的屬性。您需要使用JoinQueryOverJoinAlias加入另一個實體,然後執行where

隨着JoinQueryOver

// ... 
query = query.JoinQueryOver(x => x.Equipment) 
    .JoinQueryOver(x => x.Company) 
    .Where(c => c.Id == idCompany.Value); 

隨着JoinAlias

Equipment equipment = null; 
Company company = null; 

// ... 
query = query.JoinAlias(x => x.Equipment,() => equipment) 
    .JoinAlias(() => equipment.Company,() => company) 
    .Where(() => company.Id == idCompany.Value); 

一些更多的信息:
What is the difference between JoinQueryOver and JoinAlias?
What can be used as a NHibernate QueryOver alias?
Complex nHibernate QueryOver expression

+0

感謝:

這是通過使用擴展方法Query,在NHibernate.Linq命名空間中實現的。我使用JoinAlias解決它。 – 2012-07-08 21:54:21

+0

只是一個問題,有沒有什麼方法可以只填寫這個連接的一些屬性,我的意思是......公司實體有20多個字段,而我只需要2個(Id和Name),有沒有辦法做到這一點?謝謝 – 2012-07-08 22:29:22

+0

預測? http://www.nhforge.org/doc/nh/en/index.html#queryqueryover-projections – 2012-07-08 22:33:39

1

爲你的問題選擇的標籤讓我覺得你不想使用QueryOver,但是LINQ。對於awser人

var query = session.Query<Laudo>().Fetch(x => x.Equipament); 
if (idEquipament.HasValue) 
    query = query.Where(x => x.Equipament.Id == idEquipament.Value); 
if (idCompany.HasValue) 
    query = query.Where(x => x.Equipament.Company.Id == idCompany.Value); 
+0

嗨@Diego,不錯的提示,但我用AND()方法,因爲它genarates上的AND操作符之間的SQL語句參數(我有我的原始方法更多的參數)像'idEquipament =? AND Equipament.Company_Id =?'...並像你說的那樣使用,有沒有什麼優勢,或者它會一樣?謝謝! – 2012-07-09 02:37:47

+0

完全一樣。 – 2012-07-09 10:44:55

相關問題