【问题标题】:How to deal with datatypes returned by LINQ如何处理 LINQ 返回的数据类型
【发布时间】:2009-02-16 21:03:34
【问题描述】:

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

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

这是一些代码:

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

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

    return (IEnumerable<string>) mcodes;
}

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

【问题讨论】:

  • btw - orderby 0 不会像您想的那样做,假设您正在考虑从 TSQL 中“按第一列排序”。事实上,它什么也没做。你应该orderby p.FooId 或类似的。

标签: c# asp.net linq ado.net


【解决方案1】:

它返回一个IQueryable&lt;lkpMarketCode&gt;,假设lkpMarketCodedb.lkpMarketCodes 中的数据类型。如果你想要字符串,你需要select p.SomeProperty;,而不仅仅是select p;

您不需要强制转换(因为IQueryable&lt;T&gt; 实现了IEnumerable&lt;T&gt;);如果您将鼠标悬停在 mcodes 上,它也会告诉您这一点。

【讨论】:

  • 它只会告诉你是否将鼠标悬停在初始声明之后的 mcode 上。出于某种原因,Visual Studio 似乎不知道它声明时的类型,只有在之后才知道。
【解决方案2】:

我发现返回 List 更方便,所以我知道我在处理什么。所以你的代码是:

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

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

    return mcodes.ToList();
}

话虽如此,我几乎没有使用过 LINQ-to-SQL,所以可能有更好的方法......

【讨论】:

  • 这几乎肯定不会编译...因为已经给出的原因
  • 回想起来,我已经决定将所有内容都转换为 List 错过了使用 Linq-to-SQL 的意义,现在发现返回实际查询更有用.. :)
【解决方案3】:

它返回一个IQueryable 对象。 你的桌子怎么样?我猜这个错误是因为你的 lkpMarketCodes 表不仅仅是一个字符串列。它正在返回整个表。

如果您只想返回一个 IEnumerable 字符串,则必须返回如下所示的内容(我确定语法有点不对):

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

【讨论】:

  • 返回具有单个字符串属性的匿名类型的可枚举——而不是字符串的可枚举。
【解决方案4】:

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

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

您可以做几乎所有在 ADO 中可以做的事情,但它适用于对象而不是通用行,因此它的类型更安全。

在您的示例中,我将假设 lkpMarketCodes 是一个表,并且该表至少包含两个字段,mcode 和 description。

如果你想返回一个 IEnumerable 的 mcode,你可以这样做:

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 上,它不会告诉您类型。

【讨论】:

    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多