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

时间:2009-12-01 01:29:07

标签: c# asp.net ajax linq

我正在尝试使用.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;

5 个答案:

答案 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
目前

assetsInStorageIEnumerable<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.Namea.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 };

此时,assetsInStorageIEnumerable<string[]>,也算作IEnumerable<IEnumerable<string>>。我们可以使用IEnumerable<string>将其展平为单个SelectMany,然后将其转换为数组。

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

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

答案 4 :(得分:-1)

尝试:

return assetsInStorage.ToArray();