我的数据库中有两个表
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 :(得分: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);