2011-10-05 47 views
0

使用select我通過QueryOver在NHibernate中有一個查詢3.1如何在簡單QueryOver

var q = SessionInstance.QueryOver<Person>() 
      .Where(p => p.Code == code); 
      .Select(p => p.Name,p => p.Code); 


    return q.SingleOrDefault(); 

沒有選擇該查詢是正確的,但選擇了此消息運行時錯誤:無法投類型的對象'System.String'鍵入'MyNameSpace.Domain.Entities.Person'。我怎樣才能選擇一些人的領域?

回答

1

你需要告訴NHibernate的明確什麼是你的返回數據的類型,因爲你選擇,選擇你的原始實體p.NameP.Code這些屬性必須返回一個新的實體類型的,因此新類型的某些特定屬性會是一個新的object

var query = SessionInstance.QueryOver<Person>() 
       .Where(p => p.Code == code) 
       .Select(
        p => p.Name, 
        p => p.Code 
       ) 
       .List<object>(); 

這將解決你的問題

,或者如果你定義一個新的實體,以容納新的返回數據如下:

public newPeople 
{ 
    public Id { get; set; } 
    public Nam { get; set; } 
} 

,你可以寫這樣的:

var query = SessionInstance.QueryOver<Person>() 
       .Where(p => p.Code == code) 
       .Select(
        p => p.Name, 
        p => p.Code 
       ) 
       .Select(list => 
        new newPeople() 
        { 
          Id = (int) list[0], 
          Name = (string) list[1] 
        }) 
       .ToList<newPeople>(); 
+0

我這樣做,但是,這此消息運行時錯誤: 無法確定來自新的Person(p.Id){代碼= p.Code成員(p => p.IdentificationCode == identificationCode) 。選擇(p =>新人(p.Id) ){Code = p.Code,Name = p.Name}); return q.SingleOrDefault (); – Ehsan

+0

是的,這是正確的,因爲這部分'。選擇(p =>新人(p.Id)'你想通過這個查詢選擇什麼,你有一個預定義的'人'實體,你想選擇你的數據如果是這樣,我沒有寫這樣的嘗試我在我的答案中顯示你的方式,你是否嘗試我的答案,並按照我寫的方式工作? –

+0

我測試了你的codealready,但它有3個構建錯誤 關於「列表「字:錯誤消息: 無法將lambda表達式轉換爲類型'System.Linq.Expressions.Expression > []',因爲它不是委託類型 and On「list [0]」and「list [1]」words:error by this Message: 無法將[]的索引應用於'MyNamespace.Domain.Entities.Person – Ehsan