2010-09-14 40 views
3

我有我的数据库合并内容与LINQ到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个查询,必须有一个更有效的方法)

回答

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构造,而不是匿名形式建立,保持必要的值。

+0

结果列表需要包含AccessTime属性。 – Rana 2010-09-14 18:28:11

+0

我得到这个错误显式构造实体类型查询中的文档是不允许的。 – Rana 2010-09-14 19:37:46

+0

只是testet它,它不会返回一个错误! – AxelEckenberger 2010-09-15 05:45:42

0

假设您在DOlogs & 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); 

UPDATE:(我要猜你正在使用LINQ到实体,而不是LINQ到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

我得到这个错误显式构造实体类型查询中的文档是不允许的。 – Rana 2010-09-14 19:17:12