我是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,这是我最好的猜测。所以,我还想了解的一件事是我的数据是什么数据类型以及如何将其返回给调用函数。
答案 0 :(得分:4)
它返回IQueryable<lkpMarketCode>
,假设lkpMarketCode
是db.lkpMarketCodes
中的数据类型。如果您需要字符串,则需要select p.SomeProperty;
,而不仅仅是select p;
。
你不需要施放(因为IQueryable<T>
实施IEnumerable<T>
);如果您将鼠标悬停在mcodes
上,它也应该告诉您。
答案 1 :(得分:4)
我发现返回List&lt;&gt;更方便,所以我知道我正在处理什么。所以你的代码是:
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,所以可能有更好的方法..
答案 2 :(得分:3)
它返回一个IQueryable对象。 你的桌子怎么样?我猜这个错误是因为你的lkpMarketCodes表不只是一个字符串列。它正在返回整个表格。
如果你只想返回一个IEnumerable字符串,你将不得不返回一些看起来像这样的东西(我确信语法有点偏离):
var mcodes = from p in db.lkpMarketCodes
orderby 0
select new { p.StringColumnName };
答案 3 :(得分:0)
LINQ返回IQueryable&lt; type&gt;的。这是IEnumerable的超集。您收到错误的原因是您的查询未返回IQueryable&lt; string&gt;它返回了一个IQueryable&lt; lkpMarketCodes&gt;。 lkpMarketCodes很可能是一个对象,可以认为它类似于一行记录。
LINQ是一个对象关系映射器,它将列和行映射到字段和对象。
您可以在ADO中完成所有相同的操作,但它可以使用对象而不是通用行,因此它更安全。
在您的示例中,我将假设lkpMarketCodes是一个表,该表至少包含两个字段,mcode和description。
如果要返回IEnumerable&lt; string&gt;对于mcode,你会做这样的事情:
protected IEnumerable<string> GetMarketCodes()
{
LINQOmniDataContext db = new LINQOmniDataContext();
var mcodes = from p in db.lkpMarketCodes
orderby 0
select p.mcode;
return mcodes;
}
这将返回您的IEnumerable&lt; string&gt;代码您可以用来查找类型的一个技巧是在声明后简单地使用变量,然后将鼠标悬停在变量名称上,弹出窗口将告诉您它的类型。
也就是说,如果将鼠标悬停在返回的mcodes上,它会告诉你类型,但如果将鼠标悬停在var mcodes上,它就不会告诉你类型。