2010-02-03 84 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