Linq возвращаемый строковый массив - PullRequest
6 голосов
/ 09 сентября 2011
/// <summary>
/// Returns list of popular searches
/// </summary>
public static string[] getPopularSearches(int SectionID, int MaxToFetch)
{
    using (MainContext db = new MainContext())
    {
        return (from c in db.tblSearches where c.SectionID == SectionID && c.Featured select new[] { c.Term });
    }
}

Я посмотрел на другие вопросы, но они, кажется, немного отличаются, я получаю ошибку:

Cannot implicitly convert type 'System.Linq.IQueryable<string[]>' to 'string[]'

Я знаю, что это, вероятно, просто, кто-то может указать, что здесь не так, пожалуйста?

Ответы [ 3 ]

15 голосов
/ 09 сентября 2011

Конечно - вы пытаетесь вернуться из метода, объявленного для возврата string[], но вы возвращаете запрос - который сам по себе не является строкой.Самый простой способ преобразования запроса в массив - это вызвать метод расширения ToArray.

Однако, поскольку вы уже выбираете строковый массив длякаждый элемент в запросе, который на самом деле возвращает string[][].Я подозреваю, что вы действительно хотите выбрать одну строку для каждого элемента запроса, а затем преобразовать все это в массив, то есть код, подобный следующему:

public static string[] GetPopularSearches(int sectionID, int maxToFetch)
{
    using (MainContext db = new MainContext())
    {
        var query = from c in db.tblSearches
                    where c.SectionID == sectionID && c.Featured
                    select c.Term;
        return query.Take(maxToFetch)
                    .ToArray();
    }
}

Обратите внимание:

  • Я переименовал метод и параметры в соответствии с соглашениями об именах .NET
  • Я добавил вызов Take, чтобы использовать параметр maxToFetch
4 голосов
/ 09 сентября 2011

Вы пытаетесь вернуть нематериализованный запрос. Запрос оценивается только при его перечислении. К счастью для вас, метод ToArray избавляет от необходимости перечисления и хранения. Простое добавление его в конец вашего запроса должно исправить все.

return (
    from c in db.tblSearches 
    where c.SectionID == SectionID && c.Featured 
    select new[] { c.Term }
).ToArray();

EDIT

Рассмотрим подробнее, возможно:

return (
    from c in db.tblSearches 
    where c.SectionID == SectionID && c.Featured 
    select new[] { c.Term }
).SelectMany(x => x).ToArray();

, чтобы сгладить результаты вашего запроса, или даже (менее излишне):

return (
    from c in db.tblSearches 
    where c.SectionID == SectionID && c.Featured 
    select c.Term
).ToArray();
0 голосов
/ 09 сентября 2011

Добавьте .ToArray () в конце оператора return.

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