Линк и nhibernate возвращают один и тот же тип коллекции? - PullRequest
1 голос
/ 10 августа 2009

Если я спроектирую свой слой базы данных, чтобы я мог поменять его между реализацией linq-to-sql или nhibernate, мне придется кодировать интерфейс.

Это означает, что тип возвращаемого значения между linq и nhibernate должен быть одинаковым, т.е. список и т. Д.

Является ли тип списка одинаковым?

Ответы [ 3 ]

2 голосов
/ 10 августа 2009

Если вы инкапсулируете свой доступ к базе данных, например, с помощью шаблона репозитория, вы можете заставить репозитории реализовывать общий интерфейс и иметь методы, возвращающие тип, который вы выбрали для использования в качестве возвращаемого типа, например IEnumerable (T) или IList ( Т).

Поскольку IList (T) реализует IEnumerable (T), в этом направлении нет проблем. Если у вас есть IEnumerable (T), вы можете использовать метод расширения ToList () в IEnumerable (T), чтобы получить List (T). IQueryable (T) реализует IEnumerable (T), чтобы ToList () также отлично работал в этом случае.

Примерно так:

public interface IFooRepository
{
    IList<Foo> GetAll();
    // ...
}

public class NHibernateFooRepository : IFooRepository
{
    //...

    public IList<Foo> GetAll()
    {
        return Session.CreateCriteria(typeof(Foo)).List<Foo>();
    }
}


public class LinqToSqlFooRepository : IFooRepository
{
    //...

    public IList<Foo> GetAll()
    {
        var foos = from Foo f in context.Foos select f;
        return foos.ToList();
    }
}
1 голос
/ 10 августа 2009

IIRC, если вы не хотите использовать свой уровень базы данных без понимания запросов LINQ (используя шаблон репозитория), вам следует взглянуть на LINQ to NHibernate; в этом случае вы будете в значительной степени кодировать IQueryable<T> результаты, которые должны переводиться большую часть времени. (Хотя вы должны действительно протестировать это заранее, потому что каждый поставщик отличается в своей поддержке LINQ.)

Тем не менее, 1- * отношения в типах сущностей, вероятно, не будут иметь один и тот же тип по умолчанию (обычно это EntitySet<T> в LINQ-to-SQL и IList<T> в NHibernate), но если вы можете принудительно использовать оба LINQ -to-SQL и NHibernate для использования IList<T> или IEnumerable<T> для таких отношений, это также должно работать.

Если вы только после совместимости во время компиляции, различие между различными типами коллекций не должно быть большой проблемой, если вы придерживаетесь универсальных типов. Например, если ваше отображение NHibernate использует IList<T>, а LINQ-to-SQL использует EntitySet<T>, просто придерживайтесь методов IList<T>, и вы будете в безопасности.

Просто следите за ленивой и энергичной разницей в загрузке каждой платформы.

0 голосов
/ 10 августа 2009

NHibernate возвращает IList по умолчанию для коллекций, и многие выражения linq к ним не работают, к сожалению. Я не уверен, есть ли способ изменить тип возврата NHibernate, так как я на самом деле не изучал его.

...