【问题标题】:Merge content of two tables with LINQ-to-SQL使用 LINQ-to-SQL 合并两个表的内容
【发布时间】:2010-09-14 18:07:27
【问题描述】:

我的数据库中有两个表

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

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

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

(我的方案运行10个查询,一定有更高效的方法)

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    这应该可行:

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

    【讨论】:

    • 结果 List 需要包含 AccessTime 属性。
    • 我收到此错误 不允许在查询中显式构造实体类型文档。
    • 对“on doc.Id == log.DocId”的工作感到惊讶。在连接中,我不得不使用 equals 所以“在 doc.Id 上等于 log.DocId”。见danielmoth.com/Blog/equals-Versus.aspx
    【解决方案2】:

    假设您在 DOcuments 和 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);
    

    【讨论】:

    • 我收到此错误 不允许在查询中显式构造实体类型文档。
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多