2010-02-03 69 views
1

我無法獲得此聲明中每位作者的最新文章。從Linq的結果中獲取最後一行到Sql語句

List<Editor> lstEditors = dataContext.GetTable<Editor>().Where(t => t.M_Active).Select(t => t).ToList(); 

var lstArticles = from article in DAO.context.GetTable<Article>().ToList() 
join editor in lstEditors on article.RefEditorId equals editor.EditorId 
select 
    new 
    { 
     article.M_ArticleId, 
     article.M_Subject, 
     article.M_Text, 
     editor.M_EditorId, 
     editor.M_Member.M_EditorPicture, 
     M_NameSurname = editor.M_Member.M_Fname + " " + editor.M_Member.M_Lname 
    }; 

回答

2

小心,你的查詢獲取所有內容均編輯伢子,然後執行LINQ到對象就可以了。

我不確定你問的究竟是什麼,你想獲得所有作家(編輯)的列表以及每個作家的最後一篇文章?

你想讓那些還沒有寫任何文章的作者呢?

編輯:方法造成的直接查詢

你調用一個IQueryable對象(表或其他查詢)下面列出的方法之一任何時候

解釋,執行實際查詢到SQL Server:

  • ToList(),ToArray的(),ToLookup(),ToDictionay()
  • 計數(),SUM(),AVG(),骨料(),MIN(),MAX()
  • 一(),FirstOrDefault(),最後(),LastOrDefault()

越來越每個作家

//create a subquery that returns an editor and its last article date 
var editorLastArticleDates = 
    from article in DAO.context.GetTable<Article>() 
    group article by article.RefEditor into g 
    let lastArticleDate= g.Max(x => x.Date) 
    select new 
    { 
     Editor = g.Key, 
     LastArticleDate = lastArticleDate, 
    }; 
//Note: We did not do a ToList() here so the query is not executed 
//  The editorLastArticleDates object is a IQueryable<> 

var query = 
    from article in DAO.context.GetTable<Article>() 
    join editorLastArticleDate in editorLastArticleDates 
     on new { article.Editor, article.Date }      // 1 
     equals new { editorLastArticleDate.Editor,     // 2 
        Date = editorLastArticleDate.LastArticleDate } // 3 
    select new 
    { 
     article.M_ArticleId, 
     article.M_Subject, 
     article.M_Text, 
     article.RefEditor.M_EditorId, 
     article.RefEditor.M_Member.M_EditorPicture, 
     M_NameSurname = article.RefEditor.M_Member.M_Fname + " " 
         + article.RefEditor.M_Member.M_Lname, 
    }; 
//Note: We did not do a ToList() yet so the query is not executed 
//  The query object is a IQueryable<> 

Console.WriteLine(query.ToString()); //Displays SQL query on the console 

var results = query.ToList(); // SQL query is executed on this line. 

在上面的代碼寫的一篇文章中,我留下了一些事情的話我有問題:

  1. 使用時加入,betwee節Ñnewequals僅訪問變量之前聲明join的關鍵字而equals關鍵字後的部分訪問joinin之間定義的變量。

  2. 在編寫您的連接條件時,請確保您使用的是equals而不是==

  3. 在連接條件中使用new { XXX, YYY }語法時,您聲明瞭匿名類型。如果兩邊的屬性名稱不相同,它將不會編譯。爲了在此示例中具有相同的屬性名稱,我在值之前添加了Date =

順便說一句,你應該使用LinqPad來測試你的查詢,實在是一個很好的工具。

+0

我不知道ToList()方法提取所有行。我怎麼能阻止獲取所有行!!? 1)是的,「我希望獲得所有作家(編輯)的名單以及這些作家每一位的最後一篇文章」。 2)「你想讓那些還沒有寫任何文章的作家呢?「不,但我想學習如何得到兩者 – uzay95

+1

我很快就會更新我的答案並提出你的意見 –

+0

我等了很久,但是這是非常非常好的解釋,非常感謝... – uzay95