[英]return string[] from LINQ IQueryable object?
I'm trying to work with the .NET AJAX autocompletion extension. 我正在尝试使用.NET AJAX自动完成扩展。 The extension is expecting the following...
扩展程序期望以下...
public static string[] GetCompletionList(string prefixText, int count, string contextKey)
My database queries are in a LINQ var object. 我的数据库查询在LINQ var对象中。 I'm getting compile-time errors about not being able to convert type IQueryable to string[].
我收到无法将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;
In order to get an string[]
at first you must select only one string property on your query, not an anonymous object: 为了首先获得
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
at this moment is an IEnumerable<string>
, and then you should convert it to string[]
by: assetsInStorage
, assetsInStorage
是IEnumerable<string>
,然后应通过以下方式将其转换为string[]
:
return assetsInStorage.ToArray();
Your assetsInStorage
doesn't appear to be an IEnumerable<string>
... as such, you'd have to project your anonymous type into a string. 您的
assetsInStorage
似乎不是IEnumerable<string>
...,因此,您必须将匿名类型投影到字符串中。
assetsInStorage.Select(a=>a[0] + a[1])
(Or however you want to convert that anonymouns type to a string.) (或者,但是您想要将该匿名类型转换为字符串。)
And then you can return .ToArray()
: 然后您可以返回
.ToArray()
:
return assetsInStorage.Select(a=>a[0]+a[1]).ToArray();
This should do the trick: 这应该可以解决问题:
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();
EDITED based on comment... EF is able to interpret String.Concat(), so the additional enumeration wasn't necessary. 根据注释进行编辑... EF能够解释String.Concat(),因此不需要其他枚举。
If you want a single array that contains both a.Manufacturer.Name
and a.Name
for each of the assets, you can do that with a slight modification of CMS's answer: 如果您想要一个包含每个资产的
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 };
At this point, assetsInStorage
is an IEnumerable<string[]>
which also counts as an IEnumerable<IEnumerable<string>>
. 此时,
assetsInStorage
是IEnumerable<string[]>
,它也算作IEnumerable<IEnumerable<string>>
。 We can flatten this down to a single IEnumerable<string>
using SelectMany
and then turn it into an array. 我们可以使用
SelectMany
将其展平为单个IEnumerable<string>
,然后将其转换为数组。
return assetsInStorage.SelectMany(a => a).ToArray();
In this way, you're not required to select only a single string value. 这样,您无需仅选择一个字符串值。
尝试:
return assetsInStorage.ToArray();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.