[英]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.