C# 基本LinqToSql问题:为什么赢';这不是编译吗?

C# 基本LinqToSql问题:为什么赢';这不是编译吗?,c#,linq-to-sql,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 &

我最近通过一个工作中做得很差的项目向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>
var-territions=db.territions;
如果(某些条件)
地区=地区。其中(t=>t.PendingUserCount>0);
//无法将'System.Linq.IQueryable'隐式转换为System.Data.Linq.Table
我还尝试调用
db.territies.ToList()
,但没有用


我肯定这只是对Linq的工作原理的误解,但如果有人能帮我,我将不胜感激。

db.territies返回一个表对象。因此,“var”的类型为System.Data.Linq.Table。稍后,尝试(基于某些条件)将System.Linq.IQueryable类型的内容分配给变量。由于.NET是强类型的,编译器会抛出一个错误

var类型的变量在第一次分配时将被分配一个类型。这就是我试图记住自己的方式。

因为您键入了“var”作为表
,然后尝试将其重新指定为IQueryable

这等于说

  var i = 0

  i = "a string";

编辑:为了澄清,var是在编译时而不是运行时隐式强类型化的,这与动态类型化脚本语言不同。

您的
var
最初是作为
System.Data.Linq.Table
键入的,然后您尝试分配
Where
子句的结果(其类型为
System.Linq.IQueryable

请记住,编译器会在赋值时推断
var
的类型,因此一旦赋值,类型就无法更改

试着这样做:

System.Linq.IQueryable<Territory> territories;
if (someCondition)
    territories = db.Territories.Where(t => t.PendingUserCount > 0);
System.Linq.IQueryable领域;
如果(某些条件)
Territions=db.territions.Where(t=>t.PendingUserCount>0);

您需要像其他人建议的那样使用IQueryable tyupe:

此外,此linq查询也可能起作用:

var query = from territories in db.Territories
            where territories.SomeProperty == SomeCondition
            where territories.PendingUserCount > 0
            select territories;

对于这种类型的累积
,其中
,您需要告诉编译器使用
IQueryable

IQueryable Territions=db.Territions;
如果(某些条件)
地区=地区。其中(t=>t.PendingUserCount>0);
等

声明变量后,无法将其重新分配给其他类型。因此,您的变量声明已将其键入System.Data.Linq.Table


“var”的一个潜在的令人困惑之处是它的类型是在编译时确定的,所以你不能给它分配一系列不同的类型。有动态语言经验的人,比如Python,一开始有时会对此感到困惑。

改为这样

var territories = db.Territories;

其原因是,通过调用db.territies,您将获得所有数据,并将其返回到linq.table object.db.Territores中。其中(…将返回一个IQueryable对象。

备选方案:

var territories = db.Territories.AsQueryable();
if (someCondition)
    territories = territories.Where(t => t.PendingUserCount > 0);

好的,我知道那里发生了什么。我如何解决这个问题?理想情况下,我希望能够调用
Territions
上的
Where
,那么我必须做什么才能使db.territies返回IQueryable?为什么要尝试为db.territions分配一个值?是否要将更新发布回表中?如果不想,则需要一个separate变量将linq表达式分配给…是的,我来自Ruby,所以我想这就是我困惑的地方。我的错误,您是对的!表实现IQueryable so(+1)给您。:)
IQueryable territories = db.Territories.Where(t => t.PendingUserCount > 0);
var territories = db.Territories.AsQueryable();
if (someCondition)
    territories = territories.Where(t => t.PendingUserCount > 0);