C# 从LINQ IQueryable对象返回字符串[]?

C# 从LINQ IQueryable对象返回字符串[]?,c#,asp.net,ajax,linq,C#,Asp.net,Ajax,Linq,我正在尝试使用.NETAjax自动完成扩展。扩展需要以下内容 public static string[] GetCompletionList(string prefixText, int count, string contextKey) 我的数据库查询位于LINQ var对象中。我遇到编译时错误,无法将类型IQueryable转换为字符串[] InventoryDataContext assets = new InventoryDataContext(); var assetsIn

我正在尝试使用.NETAjax自动完成扩展。扩展需要以下内容

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;
尝试:

您的资产存储似乎不是一个IEnumerable。。。因此,您必须将匿名类型投影到字符串中

assetsInStorage.Select(a=>a[0] + a[1]) 
或者,您希望如何将匿名类型转换为字符串

然后你就可以回来了。今天:

为了首先获取字符串[],您必须在查询中仅选择一个字符串属性,而不是匿名对象:

var assetsInStorage = from a in assets.Assets
                      where a.Name.Contains(prefixText)
                      orderby a.Name ascending
                      select a.Manufacturer.Name; // or a.Name
此时AssetInstorage是一个IEnumerable,您应该通过以下方式将其转换为字符串[]:


这应该可以做到:

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,因此不需要额外的枚举。

如果您想要一个同时包含每个资产的.Manufacturer.Name和.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 };
此时,AssetInstorage是一个IEnumerable,也算作IEnumerable。我们可以使用SelectMany将其展平为单个IEnumerable,然后将其转换为数组

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

这样,,您不需要只选择单个字符串值。

它是IEnumerable,因为IQueryable继承自IEnumerable。是的,但T不是字符串,而是匿名类型T不是匿名类型,而是字符串数组。这并没有解决可枚举不是字符串而是包含两个StringsOps数组的匿名类型的问题。我在我的iPhone上看到这个,它截断了行,我没有看到第二个参数被传递到那里。。。那会教我的@John—实际上,OP的代码并不是创建一个包含两个字符串的数组的匿名类型—它只是一个包含两个字符串的数组。所以输出是IEnumerable。是的,我确认这是可行的。但是,在select语句中是否可以包含两个字段?@John:谢谢!,间隔:只需在选择中连接它们:选择a.Name++a.Manufacturer.Name;啊。。。这么简单。再次感谢CMS,等阿里怀疑你需要替换a.Name.Contains,否则你会得到像Jim Bob一样的值,当prefixText是Bob时…谢谢你指出这一点。我用以下方法修复了它。。让concat=a.Manufacturer.Name++a.Name++a.AssetID++a.ProductDivision.ProductDivision 1+a.Location.Name无论您使用的是哪种框架,都不需要ToList。最后的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();
var assetsInStorage = from a in assets.Assets
                      where a.Name.Contains(prefixText)
                      orderby a.Name ascending
                      select new[] { a.Manufacturer.Name, a.Name };
return assetsInStorage.SelectMany(a => a).ToArray();