我正在尝试使用.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;
答案 0 :(得分:8)
为了首先获得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 :(得分:1)
您的assetsInStorage
似乎不是IEnumerable<string>
...因此,您必须将您的匿名类型投射到字符串中。
assetsInStorage.Select(a=>a[0] + a[1])
(或者您想将该匿名类型转换为字符串。)
然后你可以返回.ToArray()
:
return assetsInStorage.Select(a=>a[0]+a[1]).ToArray();
答案 2 :(得分:1)
这应该可以解决问题:
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(),因此不需要额外的枚举。
答案 3 :(得分:1)
如果您想要为每个资产同时包含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();
这样,您不需要只选择一个字符串值。
答案 4 :(得分:-1)
尝试:
return assetsInStorage.ToArray();