Получение последних строк из результата оператора Linq to Sql - PullRequest
1 голос
/ 03 февраля 2010

Я не мог получить последние статьи всех авторов в этом утверждении.

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 Ответ

2 голосов
/ 03 февраля 2010

Будьте внимательны, ваш запрос извлекает все содержимое таблиц 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Замечания о вещах, с которыми у меня возникли проблемы:

  1. При использовании объединения раздел между new и equals обеспечивает доступ только к переменным, объявленным до * joinключевое слово, в то время как раздел после ключевого слова equals имеет доступ к переменной, определенной между join и in.

  2. При написании условия объединения убедитесь, что вы используете equalsа не ==.

  3. При использовании синтаксиса new { XXX, YYY } в условии соединения вы объявляете анонимные типы.Если имена свойств не идентичны с обеих сторон, он не будет компилироваться.Чтобы иметь идентичные имена свойств в этом примере, я добавил Date = перед своим значением.

Кстати, вы должны использовать LinqPad для проверки вашегозапросы, это действительно хороший инструмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...