Будьте внимательны, ваш запрос извлекает все содержимое таблиц Editor и 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.
В приведенном выше коде я оставил sЗамечания о вещах, с которыми у меня возникли проблемы:
При использовании объединения раздел между new
и equals
обеспечивает доступ только к переменным, объявленным до * join
ключевое слово, в то время как раздел после ключевого слова equals
имеет доступ к переменной, определенной между join
и in
.
При написании условия объединения убедитесь, что вы используете equals
а не ==
.
При использовании синтаксиса new { XXX, YYY }
в условии соединения вы объявляете анонимные типы.Если имена свойств не идентичны с обеих сторон, он не будет компилироваться.Чтобы иметь идентичные имена свойств в этом примере, я добавил Date =
перед своим значением.
Кстати, вы должны использовать LinqPad для проверки вашегозапросы, это действительно хороший инструмент.