简体   繁体   English

从LINQ IQueryable对象返回string []?

[英]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: assetsInStorageassetsInStorageIEnumerable<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.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 };

At this point, assetsInStorage is an IEnumerable<string[]> which also counts as an IEnumerable<IEnumerable<string>> . 此时, assetsInStorageIEnumerable<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM