Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Select(…)项目中检查引用实体是否为null将生成SQL中的所有列_C#_Nhibernate_Linq To Nhibernate - Fatal编程技术网

C# 在Select(…)项目中检查引用实体是否为null将生成SQL中的所有列

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列) 我的问题是,如何避免不必要地选择所有列(因

在LINQ到NHibernate查询投影中检查多对一实体引用是否为null时,将投影与该实体关联的表的所有表列

例如:在投影以下内容时,具有多对一参考成员用户的实体审查:

.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,但以后必须检查它。