2009-02-16 33 views
3

我是LINQ的新手,我使用LINQ to SQL連接到兩個表,它確實返回數據,這很酷。我想了解的是什麼數據類型正在返回,我該如何使用這種數據類型?如何處理由LINQ返回的數據類型

我習慣於處理數據表。如果使用LINQ,我們現在拋出數據表(現在所有其他ADO.Net對象如行,數據集等)嗎?如果是這樣,那麼我們用什麼替換它,以及如何使用它來完成我之前用數據表進行的所有工作?另外 - 替換datables是否有意義,是否存在缺陷?

下面是一些代碼:

protected IEnumerable<string> GetMarketCodes() 
{ 
    LINQOmniDataContext db = new LINQOmniDataContext(); 

    var mcodes = from p in db.lkpMarketCodes 
        orderby 0 
        select p; 

    return (IEnumerable<string>) mcodes; 
} 

此代碼當前確實返回數據(我可以看到它在調試),但錯誤的「迴歸」路線,因爲很明顯我的數據類型不是IEnumerables,這是我最好的猜測。所以,我希望瞭解的一件事是數據類型是我的數據被放入以及如何將其返回到調用函數。

+0

btw - `orderby 0`不會做你可能會想到的,假設你正在考慮TSQL中的「按第一列排序」。事實上,它什麼都不做。你應該`orderby p.FooId`或類似的。 – 2009-02-16 21:11:11

回答

4

它返回一個IQueryable<lkpMarketCode>,假設lkpMarketCodedb.lkpMarketCodes中的數據類型。如果你想要的字符串,你需要select p.SomeProperty;,而不僅僅是select p;

你不應該需要投(因爲IQueryable<T> implements IEnumerable<T>);它也應該告訴你,如果你懸停在mcodes

+0

它只會告訴你,如果你將鼠標懸停在初始聲明後面的mcodes上。出於某種原因,Visual Studio似乎並不知道它在聲明中的類型,只是在之後。 – 2009-02-16 22:24:48

3

它返回一個IQueryable對象。 你的桌子是怎樣的?我猜這個錯誤是因爲你的lkpMarketCodes表不只是一個字符串列。它正在返回整個表格。

如果你想只返回一個IEnumerable字符串,你必須返回的東西,看起來像這樣(我敢肯定,語法是有點過了):

var mcodes = from p in db.lkpMarketCodes 
orderby 0 
select new { p.StringColumnName }; 
+0

這將返回一個具有單個字符串屬性的匿名類型的枚舉 - 不是可枚舉的字符串。 – 2009-02-16 21:10:14

4

我覺得它更方便返回列表<>所以我知道我在處理什麼。所以,你的代碼將是:

protected List<string> GetMarketCodes() 
{ 
    LINQOmniDataContext db = new LINQOmniDataContext(); 

    var mcodes = from p in db.lkpMarketCodes 
        orderby 0 
        select p.SomeProperty; 

    return mcodes.ToList(); 
} 

說了這麼多,我幾乎不使用LINQ到SQL所以有可能圍繞更好的方法..

+0

這幾乎肯定不會編譯...由於已經給出的原因 – 2009-02-16 21:12:07

0

LINQ返回的IQueryable <型>的。這是IEnumerable的超集。您收到錯誤的原因是您的查詢沒有返回IQueryable <字符串>它返回IQueryable <lkpMarketCodes>。 lkpMarketCodes很可能是一個對象,它可以被認爲與一行記錄類似。

LINQ是一個對象關係映射器,它將列和行映射到字段和對象。

你可以在ADO中做幾乎所有相同的事情,但它可以處理對象而不是普通行,所以它更安全。

在你的例子中,我將假設l​​kpMarketCodes是一個表,該表由至少兩個字段mcode和description組成。

如果你想返回的MCode的的IEnumerable <串>,你會做這樣的事情:

protected IEnumerable<string> GetMarketCodes() 
{ 
    LINQOmniDataContext db = new LINQOmniDataContext(); 
    var mcodes = from p in db.lkpMarketCodes 
     orderby 0 
     select p.mcode; 
    return mcodes; 
} 

這將返回代碼,您的IEnumerable <串>。你可以使用一種技巧來找出類型,只需在聲明後使用該變量,然後將鼠標懸停在變量名上,彈出窗口會告訴你它是類型的。也就是說,如果您將鼠標懸停在返回的mcodes上,它會告訴您該類型,但是如果將鼠標懸停在var mcodes上,它將不會告訴您該類型。