2010-09-14 35 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