2009-02-16 79 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上,它将不会告诉您该类型。