Linq to Sql: Присоединяйтесь, зачем мне загружать коллекцию - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть 2 таблицы, которые мне нужно загружать вместе все время, обе должны существовать вместе в базе данных.Однако мне интересно, почему Linq to Sql требует, чтобы я загружал коллекцию, а затем выполнял объединение. Я хочу объединить только две таблицы, в которых запись paramid say = 5, пример ...

var data = _repo.All<TheData>(); //why do I need a collection/IQueryable like this?

var _workflow = _repo.All<WorkFlow>()
                .Where(x => x.WFID== paramid)
                .Join(data, x => x.ID, y => y.WFID, (x, y) => new
                {
                    data = x,
                    workflow = y
                });

Я догадываюсь, тогда мне нужно сделать SingleOrDefault()?Если запись не пуста, передайте ее обратно?

Я понимаю, что запрос Sql выходит правильно, есть ли лучший способ написать это?

ПРИМЕЧАНИЕ. Мне нужно найти таблицу с именем Participants чтобы увидеть, может ли loggedonuser на самом деле просмотреть эту запись , так что я думаю, что я должен оставить это так?(это основное требование)

var participant = _repo.All<Participants>();

.Any(x=> x.ParticipantID == loggedonuser.ID); //add this to above query...

1 Ответ

1 голос
/ 04 ноября 2011

Строка var data = _repo.All<TheData>(); - это что-то вроде «начать строить запрос к таблице TheData».Эта функция возвращает вам IQueryable, который будет содержать определение запроса к вашей базе данных.

Так что это не означает, что вы загружаете данные всей таблицы TheData этой строкой!

Запрос будет выполнен, как только вы сделаете что-то вроде .Count (), .Any (), First (), Single () или ToList ().Это называется отложенным выполнением.

Если вы завершите запрос с помощью SingleOrDefault (), это создаст SQL-запрос, объединяющий две таблицы, добавит фильтр и выберет самую верхнюю запись или ноль (или выдаст ошибкуесли их больше!).

Вы также можете использовать Linq вместо методов расширения запроса.Это будет выглядеть так:

var data = _repo.All<TheData>(); 

var _workflow = from w in _repo.All<WorkFlow>()
                join t in _repo.All<TheData> on  w.Id equals t.WFID
                where x.WIFD = paramid
                select new
                {
                    data = t,
                    workflow = x
                });
...