创建列表以包含LINQ结果?

时间:2011-03-08 21:58:39

标签: c# linq

如何定义resultList以允许存储数据库行?

List<WhatType?> resultList = new List<WhatType?>();

if(someBool){
    resultList = db.table.where(a=>a.value>0).ToList();
}
else{
    resultList = db.table.where(a=>a.values<=0).ToList();
}

我似乎无法执行以下操作,因为var需要一个初始值:

var result;

if(someBool){
    result = db.table.where(a=>a.value>0).ToList();
}
else{
    result = db.table.where(a=>a.values<=0).ToList();
}

这里有更好的解决范围问题的方法吗?

谢谢!

7 个答案:

答案 0 :(得分:0)

将其设置为空列表:

var result = new List<WhatType?>();

如果使用.NET 4.0,您可以使用动态类型,但是您需要将其强制转换:

var result  = new List<dynamic>();
result = (List<dynamic>)db.Blogs.Where(b => b.ID == 1);

答案 1 :(得分:0)

那么,您使用的是什么ORM技术?你如何获得db对象?收集的table元素的类型是什么?

如果您根本不知道,可以将此特定语句组合成条件(三元)表达式:

var result = someBool 
    ? result = db.table.Where(a=>a.value>0).ToList() 
    : db.table.Where(a=>a.values<=0).ToList();

不适用于所有情况;例如,如果您需要返回result或将其作为参数传递给另一个方法,您必须知道您期望收集的类型。但是,对于这个小块,您可以让编译器推断出类型。

编辑:如果没有关于变量db及其属性table的更多信息,我无法给出更好的答案。我的第一个问题是,你在对象和数据库之间使用了什么?是Linq2SQL吗? Linq for Entities? NHibernate的?

在所有情况下,Linq提供程序都会为您提供一个IQueryable引用,它是表达式树的基础,它将被评估并消化为本机查询语言(最常见的是SQL)。在99%的情况下,IQueryable强类型为正在生成的对象类型。如果您将上述代码插入您的程序,并将鼠标悬停在var关键字上,您将获得一个工具提示气球,其中包含推断类型的名称和说明。正如我所说,那可能是IQueryable<T>,在这个工具提示中会有一个脚注,说明在这种情况下T是什么。

如果IQueryable不是通用的,那么收集的类型将只是Object。但是,如果是这种情况,则Where方法将无法编译,因为Object没有Value或Values属性。

答案 2 :(得分:0)

在Linq2SQL中,结果大部分时间都是IQueryable。将鼠标悬停在Where子句上时,IntelliSense将显示其类型

答案 3 :(得分:0)

就个人而言,我不喜欢使用var,除非我必须这样做。所以将其定义为:

List<table> resultList = new List<table>();

if(someBool){
    resultList = db.table.where(a=>a.value>0).ToList();
}
else{
    resultList = db.table.where(a=>a.values<=0).ToList();
} 

其他答案忽略了这一点,因为您想知道如何定义类型。简单来说,将其定义为您的返回类型。如果需要Integer列表,则类型为List。关于这一点的要点是你用表名替换表,所以如果是客户你会这样做:

List<customers> resultList = new List<table>();

if(someBool){
    resultList = db.customers.where(a=>a.value>0).ToList();
}
else{
    resultList = db.customers.where(a=>a.values<=0).ToList();
} 

要扩展@ KeithS的答案,您现在可以执行以下操作:

List<customer> result = someBool ? result = db.customer.where(a=>a.value>0).ToList() 
: db.customer.where(a=>a.values<=0).ToList();

希望一切都有意义:))

答案 4 :(得分:0)

您必须使用db.table

中元素的类型

答案 5 :(得分:0)

看起来你正在使用Linq2Sql。如果是这种情况,那么您肯定知道查询的结果类型,因为您在任何一种情况下都在同一个表上执行查询。这些不是返回的匿名类型,您的ORM已将每个表映射到相应的类。

顺便说一下,你的例子会让人相信你在任何一种情况下都在查询同一张桌子。如果不是这样,那么您应该将示例更新为正确。

答案 6 :(得分:0)

resultList = db.table.where(a=>a.value>0 && someBool || a.value<=0 && !someBool).ToList();