2011-03-08 102 views
2

如何定义resultList以允许存储数据库行?创建列表以包含LINQ结果?

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(); 
} 

有没有更好的办法来解决这里我的范围有关的问题?

谢谢!

+1

对于if/else语句,'table'是否仍然相同?在了解问题出现的时候似乎有很多的信息。请澄清。 – 2011-03-08 22:20:16

回答

0

将其设置为空列表:

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

如果使用.NET 4.0,你可以利用动态类型,你需要可是投它:

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

不能将分配给隐式类型局部变量 – sooprise 2011-03-08 22:01:30

+0

对于第二点,我将列表设置为什么类型?有一种我可以使用的泛型类型吗? – sooprise 2011-03-08 22:02:18

+0

好的,你使用.NET 4吗? – 2011-03-08 22:06:19

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的实体? NHibernate的?

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

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

+0

我可以实现这一点,但它会非常混乱。我想认为有更好的方法?在达斯汀的建议中,我的列表中给出了一个简单的任意初始值? – sooprise 2011-03-08 22:04:01

+0

我想到了相同的东西,但由于进一步考虑OP可能实际上想要返回该列表作为函数的结果而犹豫了。我知道它没有说明,但只是向前看:除了从普通类型衍生出来的任何想法还有待进一步研究? – 2011-03-08 22:05:14

0

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

+0

这与什么有关? – 2011-03-08 22:06:25

+0

它与*类型已知的事实有关,OP不知道它。 – 2011-03-08 22:07:47

+0

@Mr。失望 - OP想知道类型。这是找到它的一种方法。 – 2011-03-08 22:08:13

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(); 

希望这一切有意义:)

+0

我想你错过了一点:访问'table'的实例根据'someBool',AFAIG而有所不同。 – 2011-03-08 22:08:38

+0

那么为什么它在这个例子中有相同的名字?如果你说得对,这是误导性的。 – 2011-03-08 22:09:14

+0

它是where子句中的过滤器,它不改变表本身,因此你只有一个类型:/我认为它非常清晰imho。 – 2011-03-08 22:10:56

0

你必须使用一个元素的类型从db.table

0

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

顺便说一句,你的例子会导致人们相信你在任何情况下都查询同一个表。如果这不是真的,那么你应该更新示例是正确的。

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