Как извлечь данные из нескольких таблиц, которые могут иметь или не иметь общие значения - PullRequest
0 голосов
/ 27 февраля 2012

Я просматривал всюду по сети и переполнению стека, но не смог найти способ выполнить задачу, как показано ниже:

var query = (
    from r1 in db.table1
    where r1.Timestamp == date.ToUniversalTime()
    from r2 in db.table2
        .Where(p => p.Timestamp == date.ToUniversalTime())
        .DefaultIfEmpty()
    select new
    {
        prod = r1.Value1,
        prod2 = r2.Value1
    })
    .FirstOrDefault();

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

Извиняюсь, если этот вопрос является дубликатом, но я действительно не нашел ответа, когда искал.

в SQL мы можем сделать что-то вроде этого.

Select r1.*,r2.* from table1 r1, table2 r2

Как этого добиться?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Я не уверен, почему в заголовке вашего вопроса написано «без объединения», поскольку, судя по вашему SQL, вы действительно хотите присоединиться.Но в любом случае.

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

В этом случае я бы использовал Union:

var dates = db.Table1.Select(t => t.Timestamp).Union(
            db.Table2.Select(t => t.Timestamp));

Далее выможет превратить каждую метку времени в полную строку со всей информацией:

var result = dates.Select(date => new
{
    Table1Info = db.Table1.FirstOrDefault(t => t.Timestamp == date),
    Table2Info = db.Table2.FirstOrDefault(t => t.Timestamp == date)
});

Помните, что даже если вы напишите ее в виде двух переменных, подобных этой, она все равно будет выполняться как один запрос при ее оценке (с использованием foreach, например).Это делает код немного более читабельным.

Если это не то, что вы хотели, я рекомендую вам отредактировать ваш вопрос вместо добавления дополнительных комментариев.Прямо сейчас весь вопрос, который на самом деле задает вопрос: «что такое LINQ-эквивалент select r1.*, r2.* from table1 r1, table2 r2?», И ответ на него уже опубликован.

2 голосов
/ 27 февраля 2012

Это даст вам (где db - ваш контекст данных linq):

var result= (
        from r1 in db.table1.Where(a=>a.Timestamp==date.ToUniversalTime())
        from r2 in db.table2.Where(a=>a.Timestamp==date.ToUniversalTime())
        select new
        {
            r1,
            r2
        }
    );

Это sql:

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