C# 如何处理LINQ返回的数据类型

C# 如何处理LINQ返回的数据类型,c#,asp.net,linq,ado.net,C#,Asp.net,Linq,Ado.net,我是LINQ新手,我使用LINQtoSQL链接到两个表,它确实返回数据,这很酷。我想了解的是返回的是什么数据类型,以及如何使用该数据类型 我习惯于处理数据表。如果使用LINQ,我们现在是否要丢弃数据表(以及所有其他ADO.Net对象,如行、数据集等)?如果是这样的话,我们用什么来代替它?我如何使用它来完成我以前使用datatables所做的一切?另外--替换数据库有意义吗?它们有缺陷吗 下面是一些代码: protected IEnumerable<string> GetMarketC

我是LINQ新手,我使用LINQtoSQL链接到两个表,它确实返回数据,这很酷。我想了解的是返回的是什么数据类型,以及如何使用该数据类型

我习惯于处理数据表。如果使用LINQ,我们现在是否要丢弃数据表(以及所有其他ADO.Net对象,如行、数据集等)?如果是这样的话,我们用什么来代替它?我如何使用它来完成我以前使用datatables所做的一切?另外--替换数据库有意义吗?它们有缺陷吗

下面是一些代码:

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

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

    return (IEnumerable<string>) mcodes;
}
受保护的IEnumerable GetMarketCodes()
{
LINQOmniDataContext db=新的LINQOmniDataContext();
var mcodes=从p到db.lkpMarketCodes
orderby 0
选择p;
返回(IEnumerable)微码;
}

这段代码目前确实返回数据(我可以在调试中看到),但在“返回”行出现错误,因为显然我的数据类型不是IEnumerables,这是我的最佳猜测。因此,我还想了解的一件事是,我的数据被放入什么数据类型,以及如何将其返回到调用函数。

它返回一个
IQueryable
,假设
lkpMarketCode
db.lkpMarketCodes
中的数据类型。如果需要字符串,则需要
选择p.SomeProperty
,而不仅仅是
选择p

您不需要强制转换(因为
IQueryable
实现了
IEnumerable
);如果您将鼠标悬停在
mcodes

上,它也会告诉您这一点。 你的桌子看起来怎么样?我猜错误是因为lkpMarketCodes表不仅仅是一个字符串列。它正在归还整张桌子

如果只想返回一个IEnumerable字符串,则必须返回如下内容(我确信语法有点不正确):


我发现返回列表更方便,这样我就知道我在处理什么了。所以你的代码应该是:

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

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

    return mcodes.ToList();
}
受保护列表GetMarketCodes()
{
LINQOmniDataContext db=新的LINQOmniDataContext();
var mcodes=从p到db.lkpMarketCodes
orderby 0
选择p.SomeProperty;
返回mcodes.ToList();
}
话虽如此,我几乎没有使用LINQtoSQL,因此可能有更好的方法。

LINQ返回IQueryable。这是IEnumerable的超集。出现错误的原因是查询没有返回IQueryable,而是返回了IQueryable。lkpMarketCodes很可能是一个对象,可以认为它类似于一行记录

LINQ是一个对象关系映射器,它将列和行映射到字段和对象

您可以在ADO中执行几乎相同的操作,但它使用对象而不是泛型行,因此它更安全

在您的示例中,我将假设lkpMarketCodes是一个表,该表至少包含两个字段: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 GetMarketCodes()
{
LINQOmniDataContext db=新的LINQOmniDataContext();
var mcodes=从p到db.lkpMarketCodes
orderby 0
选择p.mcode;
返回mcodes;
}
这将返回您的IEnumerable代码。查找类型的一个技巧是,只需在声明后使用变量,然后将鼠标悬停在变量名称上,弹出窗口就会告诉您它的类型


也就是说,如果您将鼠标悬停在返回mcodes上,它将告诉您类型,但如果您将鼠标悬停在var mcodes上,它将不会告诉您类型。

它返回一个匿名类型的可枚举项,带有单个字符串属性,而不是字符串的可枚举项。顺便说一句,
orderby 0
不会按照您的想法执行操作,假设您正在思考“按第一列排序“来自TSQL。事实上,它什么也没做。你应该
orderby p.FooId
或类似的。这几乎肯定不会编译。。。基于retrospect中已经给出的原因,我认为将所有内容转换为列表缺少使用Linq到SQL的意义,现在我发现返回实际查询更有用:)它只告诉您是否在初始声明之后将鼠标悬停在mcodes上。由于某种原因,VisualStudio似乎不知道声明中的类型,只是在声明之后才知道。
protected IEnumerable<string> GetMarketCodes()
{
    LINQOmniDataContext db = new LINQOmniDataContext();
    var mcodes = from p in db.lkpMarketCodes 
        orderby 0 
        select p.mcode;
    return mcodes;
}