C# 在Select(…)项目中检查引用实体是否为null将生成SQL中的所有列
在LINQ到NHibernate查询投影中检查多对一实体引用是否为null时,将投影与该实体关联的表的所有表列 例如:在投影以下内容时,具有多对一参考成员用户的实体审查:C# 在Select(…)项目中检查引用实体是否为null将生成SQL中的所有列,c#,nhibernate,linq-to-nhibernate,C#,Nhibernate,Linq To Nhibernate,在LINQ到NHibernate查询投影中检查多对一实体引用是否为null时,将投影与该实体关联的表的所有表列 例如:在投影以下内容时,具有多对一参考成员用户的实体审查: .Select(review => new { ShowPhoto = review.User == null ? false : review.User.ShowPhoto }) 或 生成的SQL正在投影用户表的所有列(基于此示例,它应该只投影ShowPhoto列) 我的问题是,如何避免不必要地选择所有列(因
.Select(review => new
{
ShowPhoto = review.User == null ? false : review.User.ShowPhoto
})
或
生成的SQL正在投影用户表的所有列(基于此示例,它应该只投影ShowPhoto列)
我的问题是,如何避免不必要地选择所有列(因为在许多情况下可能效率很低)?到目前为止,我找到的最佳解决方案是将多对一映射为具有更新的属性(错误): 实体:
public virtual UserAccount User { get; set; }
public virtual int? UserID { get; protected set; }
映射:
ManyToOne(x => x.User, mapper => mapper.Column("UserAccountID"));
Property(x => x.UserID, mapper =>
{
mapper.Column("UserAccountID");
mapper.Update(false);
});
然后使用以下命令进行查询:
.Select(review => new
{
ShowPhoto = review.UserID.HasValue && review.User.ShowPhoto
})
忽略以下方法:
一个冗长的解决方案是使用子查询:
.Select(review => new
{
ShowPhoto = reviewManager.Query().Any(r => r.Id == review.Id && r.User != null) && review.User.ShowPhoto
})
到目前为止,我找到的最佳解决方案是将多对一映射为带有Update(false)的属性: 实体:
public virtual UserAccount User { get; set; }
public virtual int? UserID { get; protected set; }
映射:
ManyToOne(x => x.User, mapper => mapper.Column("UserAccountID"));
Property(x => x.UserID, mapper =>
{
mapper.Column("UserAccountID");
mapper.Update(false);
});
然后使用以下命令进行查询:
.Select(review => new
{
ShowPhoto = review.UserID.HasValue && review.User.ShowPhoto
})
忽略以下方法:
一个冗长的解决方案是使用子查询:
.Select(review => new
{
ShowPhoto = reviewManager.Query().Any(r => r.Id == review.Id && r.User != null) && review.User.ShowPhoto
})
您可能需要编写一点LINQ或QueryOver来仅选择所需的列。当您访问
用户的单个属性时,NHibernate将把整个用户加载到内存中。您还可以通过映射中的各种延迟加载设置稍微控制这一点,但我不是肯定的。选择(…)
是LINQ到NHibernate查询的一部分,因此它取决于NHibernate希望如何将投影AST转换为SQL。代理规则根本不应该应用,因为在这一点上没有实体,它只是对查询内容的描述。我想到了如何使用子查询而不是!=or==null,但稍后必须进行检查。您可能需要编写一点LINQ或QueryOver来仅选择所需的列。当您访问用户的单个属性时,NHibernate将把整个用户加载到内存中。您还可以通过映射中的各种延迟加载设置稍微控制这一点,但我不是肯定的。选择(…)
是LINQ到NHibernate查询的一部分,因此它取决于NHibernate希望如何将投影AST转换为SQL。代理规则根本不应该应用,因为在这一点上没有实体,它只是对查询内容的描述。我想到了如何使用子查询而不是!=or==null,但以后必须检查它。