Nhibernet выберите количество - PullRequest
0 голосов
/ 12 января 2011

У меня есть два объекта

A:

public class Product
{
    public virtual int ID { get; set; }
    public virtual IList<Picture> Pictures { get;set;}
}

B:

public class Picture
{
    public virtual int ID { get;set;}
    public virtual Product { get;set;}
    public virtual Path { get;set;}
}

Как с помощью NHibernate ICriteria выбрать список, содержащий только продукты с изображениемсчитать больше 0

привет keld

Ответы [ 2 ]

0 голосов
/ 12 января 2011

Вам не нужно использовать критерий запроса для этого. Вы можете сделать это, используя простой Linq

public IEnumerable<Product> GetProductWithPictures(IEnumerable<Product> allProducts)
{
    return allProducts.Where(x=>x.Pictures.Any());
}

Обратите внимание на использование Any внутри, что быстрее, чем считать> 0.

Извините, я забыл, что вы извлекаете его из дБ. Вот что вам нужно сделать в этом случае.

public IEnumerable<Product> GetProductWithPictures()
{
    return Session.Linq<Product>.Where(x=>x.Pictures.Any());
}
0 голосов
/ 12 января 2011

Если вам нужно какое-то точное значение изображений, вы можете использовать это:

Product productAlias = null;  
var criteria = CurrentSession.CreateCriteria(typeof(Product), () => productAlias);
ICriteria productsCriteria = criteria.CreateCriteria<Product>(x => x.Pictures);

DetachedCriteria picturesCount = DetachedCriteria.For<Picture>();
picturesCount.SetProjection(Projections.RowCount());
picturesCount.Add<Picture>(x => x.Product.ID == productAlias.ID);

productsCriteria.Add(Subqueries.Gt(/*number of pictures*/, picturesCount));


return criteria.List<Customer>();

Если вам просто не нужна пустая коллекция, вы можете использовать ограничение IsNotEmpty

...