使用LINQ-to-SQL合并两个表的内容

时间:2010-09-14 18:07:28

标签: c# linq linq-to-sql

我的数据库中有两个表

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

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

如何编写LINQ查询,返回最后10个访问过的文档并从accesslogs表中填写访问时间? 我已经修改了C#中的Documents类以具有AccessTime(DateTime)属性。 LINQ查询的结果应为List。

(我的解决方案运行10个查询,必须有更有效的方法)

2 个答案:

答案 0 :(得分:0)

这应该有效:

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,而是构造了一个保存必要值的匿名类型。

答案 1 :(得分:0)

假设您在DOcuments&amp ;;之间设置了外键关系。 AccessLogs,然后Linq2SQL已经在AccessLog中创建了Document属性。

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);

更新:(我猜你正在使用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);