LINQ to SQL рабочие строки таблицы внешнего ключа - PullRequest
2 голосов
/ 08 марта 2011

Я новичок в LINQ to SQL, отсюда и этот вопрос.

По умолчанию, если я выполняю запрос для строки, извлекает ли LINQ to SQL все строки ключа foriegn?:

допустим, у меня 1-> N отношений будет 3 таблицы

Филиал -N> Отделы -N> Сотрудники Если я запрашиваю строку бренда

Branch b = (
    from b in brachDataContext.Branches 
    where b.id = id 
    select b).ToList();

Извлекает ли это все отделы, связанные с рядом филиалов, и сотрудников, связанных с этими отделами?

Если это так, разве это не будет огромным объектом.в каждом филиале может быть 10 отделов, в каждом отделе может быть 1000 сотрудников, и нам могут не понадобиться все записи.

Ответы [ 3 ]

3 голосов
/ 08 марта 2011

Linq 2 SQL по умолчанию использует отложенное выполнение, что означает, что ваши отделы будут выбираться, если вы перечислите по этой коллекции.

Тем не менее, вы можете контролировать, должны ли они быть включены в первоначальный запрос, установив свойство context.LoadOptions следующим образом:

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Branch>(b => b.Departments);
context.LoadOptions = dlo;
... query ...

Проверьте этот пост для получения дополнительной информации об отложенном исполнении.

А также ознакомьтесь с разницей между IEnumerable и IQuerable и их поведением. Это ключ к пониманию всех провайдеров Linq.

В качестве справки, мой опыт показывает, что Linq 2 Sql работает для небольших проектов, быстрой разработки и т. Д. Если у вас есть еще что-нибудь , подумайте о переходе на Entity Framework или NHibernate для более полной функциональности. опыт.

0 голосов
/ 08 марта 2011

Никакой linq-to-sql не выполняет отложенную загрузку, если не указано иное.

Если вы также хотите загрузить подробности, вы можете использовать Loadoptions в вашем тексте данных.

0 голосов
/ 08 марта 2011

Если это так, то это будет огромный объект.в каждом филиале может быть 10 отделов, а в каждом отделе может быть 1000 сотрудников, и нам могут не понадобиться все записи.

Branch b = (      from b in brachDataContext.Branches      
                  where b.id = id      
                  select b).ToList(); 

Код, который вы дадите, будет вызывать выполнение запроса каждый разСтрока кода - получение ВСЕХ данных и сохранение их в памяти.Это потому, что вы используете .ToList ()

Рассмотрите IQueryable<T> или IEnumerable<T> - это будет использовать отложенную загрузку (если включено) и должно получать только те данные, которые необходимы.

Вы также можете рассмотреть возможность использования средства профилирования SQL, чтобы точно узнать, когда выполняется запрос к базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...