使用NHibernate IQueryOver选择重复项

时间:2013-01-16 17:06:59

标签: sql linq nhibernate queryover

我正在为SQL Server 2012和IQueryOver使用NHibernate 3.3.1.4000和FluentNHibernate 1.3.0.733

我有下一堂课:

class Foo {
  public virtual int Id;
  public virtual Bar Bar;
  public virtual Baz Baz;
}
class Bar {
  public virtual int Id;
}
class Baz {
  public virtual int Id;
}

我想选择包含相同FooBar子项的所有Baz个entites。 我知道如何通过LINQ查询(IQueryable)

在理论上做到这一点
IList<Foo> fooData = Session.Query<Foo>.GroupBy(x => x, new DistinctItemComparer()).Where(g => g.Count() > 1).Select(g => g.Key).ToList();

class DistinctItemComparer : IEqualityComparer<Foo> 
{
    public bool Equals(Foo x, Foo y)
    {
        return (x.Id == y.Id) || ((x.Bar.Id == y.Bar.Id) && (x.Baz.Id == y.Baz.Id)); 
    }

    public int GetHashCode(Foo obj)
    {
        return obj.Id.GetHashCode() ^ obj.Bar.Id.GetHashCode() ^ obj.Baz.Id.GetHashCode();
    }
}

但我收到了错误:

  

无法解析表达式'value(NHibernate.Linq.NhQueryable`1 [Foo])。GroupBy(x =&gt; x,value(DistinctItemComparer))':方法'System.Linq.Queryable.GroupBy的重载'目前不受支持。

那么,也许存在其他解决方案(使用IQueryOver,可能?)来获取重复条目。不要放弃它们并获得明显的。我想要完全相同的重复。

1 个答案:

答案 0 :(得分:1)

这应该有效:

var fooData = (from foo1 in Session.Query<Foo>()
               from foo2 in Session.Query<Foo>()
               where foo1.Id != foo2.Id 
                     && foo1.Bar.Id == foo2.Bar.Id 
                     && foo1.Baz.Id == foo2.Baz.Id
               select foo1).Distinct().ToList();