使用LINQ来解决问题

时间:2010-04-13 12:09:21

标签: c# linq nhibernate

我想把我的产品类型带到Linq的列表中。

var types = (from t in NHibernateSession.Linq<Product>()
             select t.ProductType).Distinct().ToList<ProductType>();         
return types;

但它给出了一个Unable来抛出类型错误的对象

'... Domain.Product'键入'... Domain.ProductType'。

ProductType是Product的属性。

<many-to-one name="ProductType" class="Portal.Domain.ProductType, TilePortal.Domain" column="ProductTypeID" not-null="true" ></many-to-one>

编辑:似乎Linq对Nhibernate还不够成熟,无法处理此类查询。我只是希望能够创建一个简单的SQL查询,从DB中获取不同的ProductType,而不会为具有数百万产品的生产数据库带来所有产品。因此,如果您可以使用HQL os Criteria API来说明如何执行此操作,那么也将执行此操作。

2 个答案:

答案 0 :(得分:2)

您可能遇到了nHibernate LINQ实现的问题。你得到同样的错误:

 var types = (from t in NHibernateSession.Linq<Product>()
              select t.Type);

如果没有,当您尝试使用非通用ToList()时会发生什么?

 var types = (from t in NHibernateSession.Linq<Product>()
              select t.Type).Distinct().ToList();

顺便说一句,我通常会避免创建一个名称与.NET框架中的某些内容冲突的类,尤其是类似于Type的基本类。它只会导致混乱。也许您应该将其重命名为ProductType。

答案 1 :(得分:1)

我很确定linq 2 nh的实现还不支持这种事情。您可能必须先执行sql然后选择类型引用。像这样:

var types = (from t in NHibernateSession.Linq<Product>()
         select t).ToList().Select(t => t.Type).Distinct().ToList<Type>();         
return types;

如果您没有使用最新版本的提供商,请更新并再次尝试您的示例。如果实施它应该可以正常工作。

<强>更新

如果您唯一想做的就是获取所有产品类型。为什么不写这个简单的查询?

var types = (from t in NHibernateSession.Linq<ProductType>()
         select t).ToList();

当您需要类型时,无需查询您的产品。