![](/img/trans.png)
[英]selecting a property from FirstOrDefault in case FirstOrDefault returns null
[英]FirstOrDefault returns null on foreign key
可以说我们有以下型号:
public class ReadingOrder
{
public virtual int Id { get; set; }
public virtual Order Order { get; set; }
}
制图:
Table("db_ReadingOrder");
Id(o => o.Id).Column("Id").GeneratedBy.Identity();
References(o => o.Order, "OrderId");
我想得到orderId
等于1的ReadingOrder
(例如)。 但是当我尝试FirstOrDefault
,查询返回null:
var readingO = _repositoryFactory.GetRepository<ReadingOrder>().FirstOrDefault(xz => xz.Order.Id == 1);
如果我得到所有这些并且在应用FirstOrDefault
工作,但它的愚蠢:
var readingOrderList1 = _repositoryFactory.GetRepository<ReadingOrder>()
.GetAll().FirstOrDefault(xz => xz.Order.Id == 1);
存储库中的方法具有以下格式:
public T FirstOrDefault(Expression<Func<T, bool>> predicate)
{
return _session.Query<T>().FirstOrDefault(predicate);
}
简单的东西,但不工作。 如果我选择正常的财产,比如Id
,一切都按预期工作。 此外,如果我从日志中获取生成的查询并将其放在sqlite中,它将成功运行并返回读取顺序。 NHibernate有错误吗? 是映射问题吗? 或者它是SQLite的问题?
好的,最后我发现了问题:外键列“OrderId”的名称 。 Nhibernate在这种情况下查找“Hibernate.Order” ,我不知道为什么,但在我更改了列的名称后,现在从db检索该项。 谢谢大家的答案! 我给了用户Syed Farjad Zia Zaid i赏金,因为他帮我解决了这个问题。 很明显这是一个Nhibernate问题,所以再次感谢你。
我认为有两种方法可以使这项工作更改您的映射:
Table("db_ReadingOrder");
Id(o => o.Id).Column("Id").GeneratedBy.Identity();
References(o => o.Order);
然后查询:
var readingO = _repositoryFactory.GetRepository<ReadingOrder>().FirstOrDefault(xz => xz.Order.Id == 1);
否则,您还可以将映射更改为:
Table("db_ReadingOrder");
Id(o => o.Id).Column("Id").GeneratedBy.Identity();
References(o => o.Order).Column("OrderId");
然后查询:
var readingO = _repositoryFactory.GetRepository<ReadingOrder>().FirstOrDefault(xz => xz.Order.OrderId == 1);
有时候这与动态全局过滤器有关,比如IsDeleted
prop的软删除方法,所以你需要获取被忽略的项目并使用像这样的.IgnoreQueryFilters()
等方法。
使用存储库中的以下代码,相同的方案可以正常工作。
public virtual IEnumerable<T> Get(
Expression<Func<T, bool>> filter = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
string includeProperties = "")
{
IQueryable<T> query = _context.Set<T>();
if (filter != null)
{
query = query.Where(filter);
}
if (includeProperties != null)
foreach (var includeProperty in includeProperties.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
return query.ToList();
}
}
像这样修改你的类:
public class ReadingOrder
{
public virtual int Id { get; set; }
public virtual Order Order { get; set; }
public virtual int OrderId { get; set; } // Explicit and direct foreign Key
}
然后使用OrderId
而不是Order.Id
检索您的查询:
var readingO = _repositoryFactory.GetRepository<ReadingOrder>()
.FirstOrDefault(xz => xz.OrderId == 1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.