基本的LinqToSql问题:为什么不编译?

时间:2009-04-15 15:05:12

标签: c# linq-to-sql

我最近通过一个制作简单的项目向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如何运作的误解,但如果有人可以帮助我,我会很感激。

9 个答案:

答案 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。

这曾经是一场火灾。