Nhibernate 3.0 LINQ:问题返回IQueryable(非通用版本) - 不允许ToList()

时间:2010-11-23 11:39:15

标签: linq nhibernate linq-to-nhibernate iqueryable

我正在使用最新的Nhibernate,我有一个linq查询只返回1列。所以我不能使用例如IQueryable,因为没有实体类 - 我只返回1列。但是返回IQueryable Non Generic版本不提供ToList方法

这是方法

    public IQueryable GetCode()
    {
        using (ITransaction transaction = _session.BeginTransaction())
        {

            var results = (from c in _session.Query<Client>()
                           select new
                           {
                               Group = c.Code
                           }).Distinct();

        }
    }

当然,如果我这样做(见下文),我会在我的IQueryable上获得ToList方法

    public IQueryable<Client> GetCode()
    {
        using (ITransaction transaction = _session.BeginTransaction())
        {

            var results = (from c in _session.Query<Client>()
                           select c;

        }
    }

问题是我需要做DISTINCT并且只使用1列。

任何想法,我都不知所措

提前致谢

修改

当我查看通过IQueryable返回的类型时,它是

{NHibernate.Linq.NhQueryable&LT;&LT;&GT; f__AnonymousType6&GT;}

并查看返回的基类,我看到了异常

此SelectClauseVisitor不支持表达式类型10005。

1 个答案:

答案 0 :(得分:1)

以下工作不会吗?

public IQueryable<X> GetCode() // X = the type of Client.Code
{
    using (ITransaction transaction = _session.BeginTransaction())
    {

        var results = (from c in _session.Query<Client>()
                       select c.Code).Distinct();

    }
}

此处的问题不仅在于您无法在非通用ToList上调用IQueryable,而且整个结果都是无类型的,因此您无法读取Code属性每个元素。 (这可以用C#4的动态类型来解决,但这不是你想要的。)

在你的情况下,我不明白为什么你真的需要构建一个匿名类型只是为了返回一个重新命名为Code的{​​{1}}值的不同序列。返回字段的值应该足够了。

如果你需要返回 more 而不仅仅是一列,你应该创建一个显式类型,而不是使用匿名类型,所以你可以说

Group