вернуть строку [] из объекта LINQ IQueryable? - PullRequest
0 голосов
/ 01 декабря 2009

Я пытаюсь работать с расширением автозаполнения .NET AJAX. Расширение ожидает следующее ...

public static string[] GetCompletionList(string prefixText, int count, string contextKey)

Мои запросы к базе данных находятся в объекте LINQ var. Я получаю ошибки во время компиляции из-за невозможности преобразования типа IQueryable в строку [].

InventoryDataContext assets = new InventoryDataContext();
    var assetsInStorage = from a in assets.Assets
                          where a.Name.Contains(prefixText)
                          orderby a.Name ascending
                          select new[] { a.Manufacturer.Name, a.Name };
    return (string[])assetsInStorage;

Ответы [ 5 ]

8 голосов
/ 01 декабря 2009

Чтобы сначала получить string[], вы должны выбрать только одно строковое свойство в вашем запросе, а не анонимный объект:

var assetsInStorage = from a in assets.Assets
                      where a.Name.Contains(prefixText)
                      orderby a.Name ascending
                      select a.Manufacturer.Name; // or a.Name

assetsInStorage на данный момент является IEnumerable<string>, а затем вы должны преобразовать его в string[]:

return assetsInStorage.ToArray();
1 голос
/ 01 декабря 2009

Если вам нужен один массив, который содержит a.Manufacturer.Name и a.Name для каждого из активов, вы можете сделать это с небольшим изменением ответа CMS:

var assetsInStorage = from a in assets.Assets
                      where a.Name.Contains(prefixText)
                      orderby a.Name ascending
                      select new[] { a.Manufacturer.Name, a.Name };

На данный момент, assetsInStorage является IEnumerable<string[]>, который также считается как IEnumerable<IEnumerable<string>>. Мы можем свести это к одному IEnumerable<string>, используя SelectMany, а затем превратить его в массив.

return assetsInStorage.SelectMany(a => a).ToArray();

Таким образом, вам не нужно выбирать только одно строковое значение.

1 голос
/ 01 декабря 2009

Это должно сработать:

InventoryDataContext assets = new InventoryDataContext();
var assetsInStorage = from a in assets.Assets                          
   where a.Name.Contains(prefixText)
   orderby a.Name ascending
   select String.Concat(x.ManufacturerName, " ", x.Name);    

return assetsInStorage.ToArray();

ИЗМЕНЕНО на основе комментария ... EF может интерпретировать String.Concat (), поэтому дополнительное перечисление не было необходимо.

1 голос
/ 01 декабря 2009

Ваш assetsInStorage не выглядит как IEnumerable<string> ... как таковой, вам придется проецировать свой анонимный тип в строку.

assetsInStorage.Select(a=>a[0] + a[1]) 

(или, тем не менее, вы хотите преобразовать этот анонимный тип в строку.)

И тогда вы можете вернуть .ToArray():

return assetsInStorage.Select(a=>a[0]+a[1]).ToArray();
0 голосов
/ 01 декабря 2009

Попробуйте:

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