2009-12-01 126 views
0

我正在嘗試使用.NET AJAX自動完成擴展。該擴展期待以下...從LINQ IQueryable對象返回字符串[]?

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; 
+0

我懷疑你需要替換** a.Name.Contains **,或者當* prefixText *是「Bob」時你會得到類似「Jim Bob」的值...... – NVRAM 2009-12-01 01:51:08

+0

感謝您指出這一點。我用下面的方法修正了它: let concat = a.Manufacturer.Name +「」+ a.Name +「(」+ a.AssetID +「)」+ a.ProductDivision.ProductDivision1 + a.Location.Name – omencat 2009-12-01 20:45:56

回答

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 

assetsInStorage在這一刻是IEnumerable<string>,然後你應該把它轉換爲string[]由:

return assetsInStorage.ToArray(); 
+0

更好的措辭......謝謝CMS :) – 2009-12-01 01:37:09

+0

是的,我確認這個作品。是否有可能在select語句中連接兩個字段? – omencat 2009-12-01 01:40:26

+0

是的...選擇只需要返回一個字符串。 – 2009-12-01 01:41:42

-1

嘗試:

return assetsInStorage.ToArray(); 
+0

This沒有解決Enumerable 不是字符串,而是持有兩個字符串數組的匿名類型的問題 – 2009-12-01 01:38:24

+0

糟糕。我在我的iPhone上查看這個,它截斷了線路,我沒有看到第二個參數在那裏傳遞......這將教會我! – 2009-12-01 01:45:48

+0

@John - 實際上,OP的代碼並沒有創建一個擁有兩個字符串數組的匿名類型 - 它只是一個由兩個字符串組成的數組。所以輸出是'IEnumerable '。 – 2009-12-01 05:19:47

1

assetsInStorage似乎並不爲IEnumerable<string> ......正因爲如此,你有投影匿名類型爲字符串。

assetsInStorage.Select(a=>a[0] + a[1]) 

(或者無論你要轉換的是anonymouns類型爲字符串)

然後你就可以返回.ToArray()

return assetsInStorage.Select(a=>a[0]+a[1]).ToArray(); 
+0

這是'IEnumerable ',因爲'IQueryable '從IEnumerable 繼承。 – 2009-12-01 01:34:26

+0

是的,但T不是一個字符串,而是一個匿名類型 – 2009-12-01 01:36:24

+0

T不是一個匿名類型,而是一個字符串數組。 – 2009-12-01 05:20:43

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(),所以額外的枚舉是不必要的。

+1

ToList()不是必需的,不管您使用哪種框架。無論如何,底層連接關閉之前,最後的ToArray()調用將導致結果集枚舉 - 無論如何強制枚舉兩次都沒有意義。 – 2009-12-01 05:13:09

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 }; 

在這一點上,assetsInStorage是一個IEnumerable<string[]>這也算作IEnumerable<IEnumerable<string>>。我們可以使用SelectMany將其縮小爲一個IEnumerable<string>,然後將其變成一個數組。

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

以這種方式,您不需要只選擇一個字符串值。