gpt4 book ai didi

nhibernate - 使用 NHibernate Linq 查询制定内部联接时遇到问题

转载 作者:行者123 更新时间:2023-12-04 14:45:34 24 4
gpt4 key购买 nike

使用 NHibernate 3.3.1.400,我在表达使用 NHibernate 的 Linq 提供程序的简单 SQL 语句时遇到问题。

我的域模型如下所示:

public class Site
{
public virtual Guid Id {get; set;}
public virtual string Name {get; set;}
}

// a site has many filers
public class Filer
{
public virtual Guid Id {get set;}
public virtual Site Site {get; set;}
public virtual string Name {get; set;}
}

// a filer has many filings
public class Filing
{
public virtual Guid Id {get set;}
public virtual Filer Filer {get; set;}
public virtual DateTime FilingDate {get; set;}
}

//a filing has many items
public class Item
{
public virtual Guid Id {get set;}
public virtual Filing Filing {get; set;}
public virtual DateTime Date {get; set;}
public virtual decimal Amount {get; set;}
}

public class SearchName
{
public virtual Guid Id {get set;}
public virtual string Name {get; set;}
}

// there are potentially many NameLink objects tied to a single search name
public abstract class NameLink
{
public virtual Guid Id {get set;}
public virtual SearchName SearchName {get; set;}
}

public class NameLinkToFiler: NameLink
{
public virtual Filer Filer {get; set;}
}

public class NameLinkToItem: NameLink
{
public virtual Item Item {get; set;}
}

我的查询应该返回匹配 Item 元素的列表:
var query = session.Query<Item>()
.Where(x => x.Filing.Filer.Site == mySite);

连接 Site -> Filer -> Filing -> Item 的连接通过我的映射工作得很好,但是当我尝试根据用户输入连接 NameLinkToFiler 或 NameLinkToItem 类时,问题就开始了。

如果用户想用过滤器名称过滤Query结果,我想将Item查询的结果与这个查询的结果连接起来:
var filerNameQuery = session.Query<NameLinkToFiler>()
.Where(q=>q.SearchName.Contains('some name'));

我希望 NameLinkToFiler.Filer 属性的结果加入 Item.Filing.Filer 属性,因此我的返回项目列表减少了。

注意:上面的“包含”关键字是我使用的全文索引搜索 here .它工作正常,让我们假设 filerNameQuery 是 IQueryable<NameLinkToFiler> .

在直接 SQL 中很容易做到这一点:
select filer.Name, filing.FilingDate, filer.Name, item.Date, item.Amount
from Search_Name searchNameForFiler, Search_Name searchNameForItem, Name_Link_Filer nameLinkFiler,
Name_Link_Item nameLinkItem, Item item, Filing filing, Filer filer, Site s
where
contains(searchNameForFiler.Name, :filerName) and searchNameForFiler.Id = nameLinkFiler.SearchNameId and nameLinkFiler.FilerId = filer.Id and
contains(searchNameForItem.Name, :itemName) and searchNameForItem.Id = nameLinkItem.SearchNameId and nameLinkItem.ItemId = item.Id
and item.FilingId = filing.Id
and filing.FilerId = filer.Id
and filing.SiteId = :site

...但我不想丢失此类查询的编译时检查。

谢谢。

最佳答案

显然,答案是不使用 lambda 语法。

这工作正常:

query = from t in parentItemQuery
join l in Session.Query<NameLinkToFiler>() on t.Filing.Filer.Id equals l.Filer.Id
join n in Session.Query<SearchName>() on l.SearchName.Id equals n.Id
where sn.Contains(request.FilerName)
select t;

关于nhibernate - 使用 NHibernate Linq 查询制定内部联接时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21103058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com