FluentNhibernate Criteria LeftOuterJoin生成重复的行

时间:2015-05-19 13:42:01

标签: c# fluent-nhibernate criteria nhibernate-criteria icriteria

假设我有以下课程:

public class Fund : EntityBase
{             
    public virtual string Name { get; set; }
    public virtual IList<FundDetail> FundDetails { get; set; }
    public virtual IList<FundAlias> FundAliases { get; set; } 

    public Fund()
    {
        FundDetails=new List<FundDetail>();
        FundAliases=new List<FundAlias>();    
    }
}

public class FundDetail : EntityBase
{
    public virtual string Symbol { get; set; }
    public virtual Fund Fund { get; set; }   
}

public class FundAlias : EntityBase
{
    public virtual string Symbol { get; set; }
    public virtual string Name { get; set; }
    public virtual Fund Fund { get; set; }
}

我的查询:

filterValue =&#34; sometext&#34;

var criteria = session.CreateCriteria<Fund>();
criteria.CreateAlias("FundDetails", "fd", JoinType.LeftOuterJoin);
criteria.CreateAlias("FundAliases", "fa", JoinType.LeftOuterJoin);

criteria.Add(
    Restrictions.InsensitiveLike("fd.Symbol", filterValue, MatchMode.Anywhere) ||
    Restrictions.InsensitiveLike("Name", filterValue, MatchMode.Anywhere) ||
    Restrictions.InsensitiveLike("fa.Symbol", filterValue, MatchMode.Anywhere));

criteria.SetFirstResult(0).SetMaxResults(100);
criteria.SetResultTransformer(new DistinctRootEntityResultTransformer());
var list = criteria.List<Fund>();

我试图获得所有基金,其中来自fundDetail的基金或符号的名称或来自FundAlias的符号包含简单字符串的filterValue,并获得100个结果。

因为LeftOuterJoin生成了重复的基金行,并且因为生成的查询(SQL语法)中不存在" criteria.SetResultTransformer(new DistinctRootEntityResultTransformer());",尽管事实上有超过100个结果我没有得到100行,我得到不同的数字根据重复的行数。 我用“&#34;预测&#34;

来做这件事。
criteria.SetProjection(
    Projections.Distinct(Projections.ProjectionList()
        .Add(Projections.Alias(Projections.Property("Name"), "Name"))
        .Add(Projections.Alias(Projections.Property("Id"), "Id"))
    )
);

但我没有找到如何使用CriteriaNote为集合设置SetProjections:

我做错了什么?这是使用Criteria执行此操作的原因吗?

注意:请注意:我不想使用QueryOver执行此操作,我需要使用Criteria。

1 个答案:

答案 0 :(得分:1)

apply plugin: 'com.android.application'

android {
   compileSdkVersion 21
   buildToolsVersion "21.1.2"

   defaultConfig {
       applicationId "com.kaist.se.pmpapp"
       minSdkVersion 16
       targetSdkVersion 21
       versionCode 1
       versionName "1.0"
   }

buildTypes {
       release {
          minifyEnabled false
          proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
      }
sourceSets { main { java.srcDirs = ['src/main/java', 'src/androidTest/java'] } } }



dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    androidTestCompile 'org.robolectric:robolectric:2.4'
    androidTestCompile 'junit:junit:4.12'
    androidTestCompile group: 'junit', name: 'junit', version: '4.12'
  }