获取Linq结果到Sql语句的最后一行

时间:2010-02-03 20:38:52

标签: linq linq-to-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
    };

1 个答案:

答案 0 :(得分:2)

请注意,您的查询正在获取编辑器 Yazi 表的所有内容,然后执行Linq-to-Objects在它上面。

我不确定你的问题是什么,你想获得所有作家(编辑)的清单以及每一位作家的最后一篇文章吗?

你想让那些没有写过任何文章的作家吗?

修改:

解释导致立即查询的方法

每次在IQueryable对象(表或其他查询)上调用下面列出的方法之一时,它都会对SQL服务器执行实际查询:

  • ToList(),ToArray(),ToLookup(),ToDictionay()
  • Count(),Sum(),Avg(),Aggregate(),Min(),Max()
  • First(),FirstOrDefault(),Last(),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. 使用加入时,newequals之间的部分仅访问 join关键字之前声明的变量,equals之后的部分join 1}}关键字可以访问inequals之间定义的变量。

  2. 撰写加入条件时,请务必使用==而不是new { XXX, YYY }

  3. 在连接条件中使用Date =语法时,声明匿名类型。如果两侧的属性名称不相同,则无法编译。为了在此示例中使用相同的属性名称,我在我的值之前添加了{{1}}。

  4. 顺便说一句,您应该使用LinqPad来测试您的查询,这真是一个不错的工具。