我无法在本声明中获得每位作家的最后文章。
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
};
答案 0 :(得分:2)
请注意,您的查询正在获取编辑器和 Yazi 表的所有内容,然后执行Linq-to-Objects在它上面。
我不确定你的问题是什么,你想获得所有作家(编辑)的清单以及每一位作家的最后一篇文章吗?
你想让那些没有写过任何文章的作家吗?
修改:
解释导致立即查询的方法
每次在IQueryable对象(表或其他查询)上调用下面列出的方法之一时,它都会对SQL服务器执行实际查询:
收到每位作家撰写的最后一篇文章
//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.
在上面的代码中,我对我遇到的问题留下了一些评论:
使用加入时,new
和equals
之间的部分仅访问 join
关键字之前声明的变量,equals
之后的部分join
1}}关键字可以访问in
和equals
之间定义的变量。
撰写加入条件时,请务必使用==
而不是new { XXX, YYY }
。
在连接条件中使用Date =
语法时,声明匿名类型。如果两侧的属性名称不相同,则无法编译。为了在此示例中使用相同的属性名称,我在我的值之前添加了{{1}}。
顺便说一句,您应该使用LinqPad来测试您的查询,这真是一个不错的工具。