Stu*_*ens 7 c# sql-server nhibernate orm fluent-nhibernate
我有一个使用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; }
}
Run Code Online (Sandbox Code Playgroud)
我在服务器端有一个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
)
Run Code Online (Sandbox Code Playgroud)
我希望能够调用此函数并将结果映射到下面的类中
public class FResult
{
public Match Match1 { get; set; }
public Match Match2 { get; set; }
public int sc { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
用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]
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
并执行如下查询:
Session.GetNamedQuery("getfresult")
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(FResult)))
.List<FResult>();
Run Code Online (Sandbox Code Playgroud)
这是迄今为止我发现执行任务的最简单和最简单的方法.
IResultTransformer用于将查询结果转换为应用程序可见的类型。
此外,将 SQL 函数调用映射为命名 SQL 查询将提供更清晰的代码。
var list = Session.GetNamedQuery("ftMatchTest")
.SetResultTransformer(new AliasToFResultTransformer())
.List<FResult>();
Run Code Online (Sandbox Code Playgroud)
由于我们有一个多表结果,AliasToBeanResultTransformer 不能直接使用。相反,我们将对其进行子类化并将结果转换为所需的类型。
public class AliasToFResultTransformer : AliasToBeanResultTransformer
{
public AliasToFResultTransformer() : base(typeof(FMatches)) {}
object IResultTransformer.TransformTuple(object[] tuple, string[] aliases)
{
FMatches fm = base.TransformTuple( tuple, aliases ) as FMatches;
return fm.ToFResult();
}
public class FMatches
{
public int sc { get; set; }
public virtual int Mt1ID { get; set; }
public virtual string Mt1Word { get; set; }
public virtual int Mt1WordIntervalBeginning { get; set; }
public virtual int Mt1WordIntervalEnding { get; set; }
public virtual int Mt2ID { get; set; }
public virtual string Mt2Word { get; set; }
public virtual int Mt2WordIntervalBeginning { get; set; }
public virtual int Mt2WordIntervalEnding { get; set; }
public FResult ToFResult()
{
return new FResult {
sc = this.sc,
Match1 = new Match {
Id = this.Mt1Id,
Word = this.Mt1Word,
WordIntervalBeginning = this.Mt1WordIntervalBeginning,
WordIntervalEnding = this.Mt1WordIntervalEnding
},
Match2 = new Match {
Id = this.Mt2Id,
Word = this.Mt2Word,
WordIntervalBeginning = this.Mt2WordIntervalBeginning,
WordIntervalEnding = this.Mt2WordIntervalEnding
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8159 次 |
| 最近记录: |