Ast*_*aar 15 c# nhibernate fluent-nhibernate queryover
我已经阅读了很多关于同样错误的问题,但没有找到与我的确切问题相符的问题.我正在尝试使用Fluent NHibernate访问对象的属性,它本身是根对象的一部分.一些答案说我需要使用投影,其他我需要使用连接,我认为它应该通过延迟加载.
这是我的两个类以及Fluent映射:
艺术家班
public class Artist
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Album> Albums { get; set; }
public virtual string MusicBrainzId { get; set; }
public virtual string TheAudioDbId { get; set; }
public Artist() { }
}
public class ArtistMap : ClassMap<Artist>
{
public ArtistMap()
{
LazyLoad();
Id(a => a.Id);
Map(a => a.Name).Index("Name");
HasMany(a => a.Albums)
.Cascade.All();
Map(a => a.MusicBrainzId);
Map(a => a.TheAudioDbId);
}
}
Run Code Online (Sandbox Code Playgroud)
专辑类
public class Album
{
public virtual int Id { get; set; }
public virtual Artist Artist { get; set; }
public virtual string Name { get; set; }
public virtual IList<Track> Tracks { get; set; }
public virtual DateTime ReleaseDate { get; set; }
public virtual string TheAudioDbId { get; set; }
public virtual string MusicBrainzId { get; set; }
public Album() { }
}
public class AlbumMap : ClassMap<Album>
{
public AlbumMap()
{
LazyLoad();
Id(a => a.Id);
References(a => a.Artist)
.Cascade.All();
Map(a => a.Name).Index("Name");
HasMany(a => a.Tracks)
.Cascade.All();
Map(a => a.ReleaseDate);
Map(a => a.TheAudioDbId);
Map(a => a.MusicBrainzId);
}
}
Run Code Online (Sandbox Code Playgroud)
并且在解释此代码时会发生错误:
var riAlbum = session.QueryOver<Album>()
.Where(x => x.Name == albumName && x.Artist.Name == artist)
.List().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
当Fluent NHibernate尝试解析x.Artist.Name值时,会发生错误:
{"无法解析属性:Artist.Name of:Album"}
这样做的正确方法是什么?
And*_*ker 30
您必须将QueryOver查询视为(几乎)直接转换为SQL.考虑到这一点,想象一下这个SQL查询:
select
Album.*
from
Album
where
Album.Name = 'SomeAlbumName' and
Album.Artist.Name = 'SomeArtistName'
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为您无法访问SQL语句中的相关表的属性.您需要创建从连接Album
到Artist
并再使用Where
条款:
var riAlbum =
session.QueryOver<Album>()
.Where(al => al.Name == albumName)
.JoinQueryOver(al => al.Artist)
.Where(ar => ar.Name == artistName)
.List()
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
此外,由于您正在使用FirstOrDefault
,您可能需要考虑将该逻辑移动到数据库端.目前,您正在撤回符合条件的每条记录,然后选择第一条记录.您可以使用.Take
将查询限制为1个结果:
var riAlbum =
session.QueryOver<Album>()
.Where(al => al.Name == albumName)
.JoinQueryOver(al => al.Artist)
.Where(ar => ar.Name == artistName)
.Take(1)
.SingleOrDefault<Album>();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15238 次 |
最近记录: |