我最近通过一个制作简单的项目向LinqToSQL介绍自己。我很好奇为什么会这样:
var territories = db.Territories.Where(t => t.PendingUserCount > 0);
但是这会导致编译错误:
var territories = db.Territories;
if (someCondition)
territories = territories.Where(t => t.PendingUserCount > 0);
// Cannot implicitly convert 'System.Linq.IQueryable<Territory> to System.Data.Linq.Table<Territory>
我也试过打电话给db.Territories.ToList()
,但无济于事。
我确信这只是对Linq如何运作的误解,但如果有人可以帮助我,我会很感激。
答案 0 :(得分:8)
db.Territories返回一个表对象。因此'var'的类型为System.Data.Linq.Table。稍后您尝试(基于某些条件)将类型System.Linq.IQueryable分配给变量。由于.NET是强类型的,编译器会抛出错误。
var类型的变量将在首次分配时分配一个类型。这就是我试图记住自己的方式。
答案 1 :(得分:7)
对于这种类型的累积Where
,您需要告诉编译器使用IQueryable<T>
:
IQueryable<Territory> territories = db.Territories;
if (someCondition)
territories = territories.Where(t => t.PendingUserCount > 0);
... etc
答案 2 :(得分:5)
替代:
var territories = db.Territories.AsQueryable();
if (someCondition)
territories = territories.Where(t => t.PendingUserCount > 0);
答案 3 :(得分:3)
更改为
var territories = db.Territories;
到
IQueryable territories = db.Territories.Where(t => t.PendingUserCount > 0);
原因是通过调用db.Territories,您将获取所有数据,并将其返回到linq.table对象中。 Db.Territores.where(...将返回一个IQueryable对象。
答案 4 :(得分:2)
关于“var”的一个可能令人困惑的事情是它的类型是在编译时确定的,因此你不能为它分配一系列不同的类型。具有动态语言经验的人,比如Python,有时会对此感到困惑。
答案 5 :(得分:1)
您的var territories
最初输入为System.Data.Linq.Table<Territory>
,然后您尝试将Where
子句(类型为System.Linq.IQueryable<Territory>
)的结果分配给它。
请记住,编译器在赋值时会推断var
的类型,因此一旦分配,就无法更改类型。
尝试这样的事情:
System.Linq.IQueryable<Territory> territories;
if (someCondition)
territories = db.Territories.Where(t => t.PendingUserCount > 0);
答案 6 :(得分:0)
因为您已将“var”键入表<Territory
&gt;然后尝试将其重新分配为IQueryable <Territory
&gt;。
这相当于说
var i = 0
i = "a string";
编辑:为了澄清,与动态类型的脚本语言不同,var在编译时而非运行时是隐式强类型的。
答案 7 :(得分:0)
您需要像其他人建议的那样使用IQueryable类型:
此linq查询也可能有效:
var query = from territories in db.Territories
where territories.SomeProperty == SomeCondition
where territories.PendingUserCount > 0
select territories;
答案 8 :(得分:0)
在声明var之后,您无法将var重新指定给其他类型。所以你的var声明已经将它输入到System.Data.Linq.Table。
这曾经是一场火灾。