[英]return string[] from LINQ IQueryable object?
我正在嘗試使用.NET AJAX自動完成擴展。 擴展程序期望以下...
public static string[] GetCompletionList(string prefixText, int count, string contextKey)
我的數據庫查詢在LINQ var對象中。 我收到無法將IQueryable類型轉換為string []的編譯時錯誤。
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;
為了首先獲得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
, assetsInStorage
是IEnumerable<string>
,然后應通過以下方式將其轉換為string[]
:
return assetsInStorage.ToArray();
您的assetsInStorage
似乎不是IEnumerable<string>
...,因此,您必須將匿名類型投影到字符串中。
assetsInStorage.Select(a=>a[0] + a[1])
(或者,但是您想要將該匿名類型轉換為字符串。)
然后您可以返回.ToArray()
:
return assetsInStorage.Select(a=>a[0]+a[1]).ToArray();
這應該可以解決問題:
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(),因此不需要其他枚舉。
如果您想要一個包含每個資產的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>>
。 我們可以使用SelectMany
將其展平為單個IEnumerable<string>
,然后將其轉換為數組。
return assetsInStorage.SelectMany(a => a).ToArray();
這樣,您無需僅選擇一個字符串值。
嘗試:
return assetsInStorage.ToArray();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.