我有以下SQL代码:
SELECT err.*,tmp.counted FROM sm_database.error err
LEFT JOIN (
SELECT sme_Hash, COUNT(*) as counted FROM sm_database.error GROUP BY sme_Hash
) tmp
ON tmp.sme_Hash = err.sme_Hash
WHERE sme_Id = 197
上面会给我一个额外的列数,它应该设置在我的Count属性下面。
id 197将是我将在方法中使用的参数。
我的班级名称是:
public class Error {
public virtual int Count { get; set; }
public virtual DateTime Date { get; set; }
public virtual int Id { get; set; }
public virtual string Hash { get; set; }
-----------------
//more property's
}
我想"转换"这与NHibernate一起使用Query(或QueryOver)
任何人都知道如何正确地做到这一点或者能指出我正确的方向吗?
修改
我得到了以下内容:
string query = @"SELECT err.* ,tmp.Count
FROM sm_database.error err
LEFT JOIN (
SELECT sme_Hash as Hash, COUNT(*) as Count FROM sm_database.error GROUP BY sme_Hash
) tmp
ON tmp.Hash = err.sme_Hash
WHERE sme_Id = :id";
var result = session.CreateSQLQuery(query)
.AddEntity(typeof(Error))
.SetParameter("id", id).List<Error>().SingleOrDefault();
它工作正常,除了Count属性之外,它被拉出。
我的Error类中的Count属性未被映射,因为我们在数据库中没有列,因为我们计算了查询中的计数。
有没有办法在我的Error.Count属性中获取tmp.Count值?
提前致谢。
答案 0 :(得分:3)
没有简单的答案,没有针对这种SQL构造的内置解决方案。
如何解决的选项是:
1)创建特殊实体并将其映射到此视图:UPDATE tbl_Main
INNER JOIN tbl_Import ON tbl_Main.CML_Vertragsnummer = tbl_Import.CML_Vertragsnummer
SET tbl_Main.Kundennummer = tbl_Import.Kundennummer;
它可以是DB视图或使用subselect进行映射(请参阅Mapping native sql to Entity with NHibernate)
2)使用带有CreateSQLQuery的本机SQL
因为NHibernate在Entity模型之上提供查询。即FROM始终来自映射。无法如上所述创建