2009-04-15 113 views
4

我一直在介绍自己LinqToSQL最近通过一个糟糕的项目在工作。我很好奇,为什么这个工程:基本的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工作原理的误解,但如果有人能帮我解决问题,我会很感激。

回答

5

替代:

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

db.Territories返回一个表对象。因此'var'的类型是System.Data.Linq.Table。稍后,您可以尝试(基于某些条件)将某种类型的System.Linq.IQueryable分配给该变量。由于.NET是强类型的,编译器会引发错误。

类型var的变量将被分配一个类型,当他们被首先分配。这就是我试图记住自己的方式。

+0

好吧,我看到发生了什么有 我怎样才能解决这个获得理想的情况下,我想?为了能够在'territories'上调用'.Where',那么我需要做些什么才能让db.Territories返回一个IQueryable? – 2009-04-15 15:09:39

+0

为什么你要为db.Territories指定一个值?你想发布一个更新回表格?如果没有,将需要一个单独的变量来分配您的linq表达式... – flatline 2009-04-15 15:15:41

0

因为您已将“var”输入为表<Territory>,然后尝试将其重新分配为IQueryable <Territory>。

这相当于说

var i = 0 

    i = "a string"; 

编辑:为了澄清,VAR是在编译时隐式强类型不运行时,不像动态类型的脚本语言。

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

您需要使用的IQueryable tyupe如其他人所说:

也是这个LINQ查询也许也行:

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

对于这种类型的累积Where,您需要告诉编译器使用IQueryable<T>

IQueryable<Territory> territories = db.Territories; 
if (someCondition) 
    territories = territories.Where(t => t.PendingUserCount > 0); 
... etc 
+0

这不会工作,因为“db.Territories”是表格本身。 – 2009-04-15 15:11:47

+0

没有问题分配它。刚刚尝试过。 – 2009-04-15 15:15:54

+0

我的错误,你是对的!表格实现IQueryable so(+1)给你。 :) – 2009-04-15 15:20:34

0

声明后,您无法将var重新分配给其他类型。所以你的var声明已经将它输入到System.Data.Linq.Table。

这是一次火灾。

2

关于“var”的一个潜在令人困惑的事情是它的类型是在编译时确定的,所以你不能为它分配一系列不同的类型。有动态语言经验的人,比如Python,起初有时会被这个困惑。

+0

是的,我来自Ruby,所以我认为这是我困惑的地方。 – 2009-04-15 15:15:00

3

改变这种

var territories = db.Territories; 

IQueryable territories = db.Territories.Where(t => t.PendingUserCount > 0); 

的原因是通过调用db.Territories,你所得到的所有数据传回,在linq.table对象返回它。 Db.Territores.where(...会返回一个IQueryable对象,而不是

+0

但现在你必须弄清楚类型,不好。 – leppie 2009-04-15 15:18:04