У меня есть приложение, которое использует NHibernate в качестве ORM. У меня есть один постоянный класс:
public class Match : IEntity
{
public virtual int ID { get; set; }
public virtual string Word { get; set; }
public virtual int WordIntervalBeginning { get; set; }
public virtual int WordIntervalEnding { get; set; }
}
и у меня есть функция SQL на стороне сервера:
CREATE FUNCTION ftMatchTest
( )
RETURNS TABLE
AS
RETURN
(
SELECT mt1.*, mt2.*,
CASE WHEN mt1.Word = mt2.Word THEN 1 ELSE 0 END AS sc
FROM
dbo.tMatchesTest mt1, dbo.tMatchesTest mt2
)
Я хочу иметь возможность вызывать эту функцию и отображать результат в следующем классе
public class FResult
{
public Match Match1 { get; set; }
public Match Match2 { get; set; }
public int sc { get; set; }
}
Можно ли сделать это с NHibernate 3.0? Можно ли это сделать с помощью FluentNHibernate?
Заранее спасибо!
ОБНОВЛЕНО
Я сопоставляю класс Match с таблицей tMatchesTest.
Структура таблицы tMatchesTest:
CREATE TABLE [dbo].[tMatchesTest](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Word] [varchar](50) NOT NULL,
[WordIntervalBeginning] [int] NOT NULL,
[WordIntervalEnding] [int] NOT NULL,
CONSTRAINT [PK_tMatchesTest] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
UPDATED2
Решение, которое я нашел самостоятельно:
1. Создайте именованный запрос, подобный этому
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace=" ConsoleApplication8.Domain.Entities"
assembly="ConsoleApplication8">
<resultset name="fresult-resset">
<return alias="Match1" class="Match"/>
<return alias="Match2" class="Match"/>
<return-scalar column="sc" type="int"/>
</resultset>
<sql-query name="getfresult" resultset-ref="fresult-resset">
SELECT {Match1.*}, {Match2.*},
CASE WHEN Match1.Word = Match2.Word THEN 1 ELSE 0 END sc
FROM dbo.tMatchesTest Match1, dbo.tMatchesTest Match2
</sql-query>
</hibernate-mapping>
, и выполните такой запрос:
Session.GetNamedQuery("getfresult")
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(FResult)))
.List<FResult>();
Это самый короткий и простой способ, который я нашел до сих пор для выполнения задачи.