Объединить содержимое двух таблиц с LINQ-to-SQL - PullRequest
3 голосов
/ 14 сентября 2010

В моей базе данных две таблицы

Table:Documents
Id (int), DocName (nvarchar)
----------------------------

Table:AccessLogs
Id (int), DocId (int), AccessTime (DateTime)
----------------------------

Как я могу написать запрос LINQ, который возвращает последние 10 посещенных документов и заполняет время доступа из таблицы accesslogs? Я изменил класс документов в C #, чтобы иметь свойство AccessTime (DateTime). Результаты запроса LINQ должны иметь тип List.

(Мое решение выполняет 10 запросов, должен быть более эффективный метод)

Ответы [ 2 ]

0 голосов
/ 14 сентября 2010

Предполагая, что между DOcuments & AccessLogs установлена ​​связь с внешним ключом, Linq2SQL уже создал свойство Document в AccessLog.

var lastTen = 
    (from al in db.AccessLogs
    orderby al.AccessTime desc
    select new Document
    {
      ID = al.DocId,
      DocName = al.Document.DocName,
      AccessTime = al.AccessTime
    }).Take(10);

UPDATE: (я собираюсь догадаться, что выиспользуя linq-to-Entities вместо Linq-to-Sql.) Тогда ваша основная предпосылка (создание List<Document>) невозможна.
Лучшее, что вы можете сделать, это List<SomethingLikeADocument>.

class SomethingLikeADocument
{
     public int ID {get; set;}
     public string DocName {get; set;}
     public DateTime AccessTime {get; set;}
}


var lastTen = 
    (from al in db.AccessLogs
    orderby al.AccessTime desc
    select new SomethingLikeADocument
    {
      ID = al.DocId,
      DocName = al.Document.DocName,
      AccessTime = al.AccessTime
    }).Take(10);
0 голосов
/ 14 сентября 2010

Это должно работать:

var lastTen = (
  from doc in Documents
  join log in AccessLogs on doc.Id equals log.DocId
  order by log.AccessTime desc
  select doc
).Take(10).Reverse().ToList();

Редактировать - Затем используйте следующее:

var lastTen = (
  from doc in Documents
  join log in AccessLogs on doc.Id equals log.DocId
  order by log.AccessTime desc
  select new { 
      DocId = doc.Id, 
      DocName = doc.DocName, 
      LogId = Log.Id, 
      AccessTime = log.AccessTime 
  }
).Take(10).Reverse().ToList();

Редактировать 2

Предполагая, что в DBML смоделирована взаимосвязь, вы также можете выбрать только последние десять записей журнала и затем обратиться к связанному документу через автоматически сгенерированное свойство .Document.

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

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