C# 为什么在执行Where子句时,此Linq to SQL查询不强制转换对象?

C# 为什么在执行Where子句时,此Linq to SQL查询不强制转换对象?,c#,windows-phone-7,linq-to-sql,C#,Windows Phone 7,Linq To Sql,我有一个类似如下的Linq查询 var dataByWheels = this.Db.Cars.Cast<IVehicle>().Where(v => (v.NumWheels == 4)); [Table] public class Car : IVehicle { [Column] public double Weight { get; set; } ... public int NumWheel {

我有一个类似如下的Linq查询

var dataByWheels = this.Db.Cars.Cast<IVehicle>().Where(v => (v.NumWheels == 4));
[Table]
public class Car : IVehicle
{
     [Column]
     public double Weight { get; set; }

     ...

     public int NumWheel 
     {
         get { return 4; }
     }
}
因此,在这种情况下,
NumWheels
属性不存储在数据库中,但是如果强制转换完成,那么它应该是正常的。然而,有人提出了一个例外

The member 'MyProject.IVehicle.NumWheels' has no supported translation to SQL
这意味着它没有执行第次强制转换。当我在
Cast
之后向链中插入
ToList()
时,它确实起作用,但我认为这是过早地解决查询并创建整个表的巨大列表,并且希望避免,因为我正在使用手机

我做错了什么


(注意,我更改了名称和查询以简化此操作)

问题不在于LINQ,而在于使用上下文。这个特定的LINQ查询正在一个可查询的表上使用,强制转换将迫使它转到DB并在该点上收回所有结果。然后,您可以对枚举进行强制转换并继续,但在本例中,它很可能不是您想要的


该错误只是表示您编写了一个无法映射到SQL并在SQL server上执行的表达式。这是EF问题,而不是LINQ问题。

问题不在于LINQ,而在于使用环境。这个特定的LINQ查询正在一个可查询的表上使用,强制转换将迫使它转到DB并在该点上收回所有结果。然后,您可以对枚举进行强制转换并继续,但在本例中,它很可能不是您想要的


该错误只是表示您编写了一个无法映射到SQL并在SQL server上执行的表达式。这是EF的东西,不是LINQ的东西。

这是因为当您针对LINQ to SQL类发出
Where
语句时,LINQ to SQL引擎希望您直接对数据库执行WHERE语句,并尝试将该语句映射到原始T-SQL,因为
NumWheels
不是数据库列,所以它无法这样做

要克服这一点,您可以先对其执行
ToList
,但如果执行此操作,请注意性能影响。此代码将在整个
Cars
表中循环,并在内存中进行过滤。然而,我想不出其他方法来实现你的目标

var dataByWheels = this.Db.Cars.ToList().Where(v => (v.NumWheels == 4));

发生这种情况的原因是,当您针对LINQ to SQL类发出
Where
语句时,LINQ to SQL引擎希望您直接针对数据库执行Where语句,并尝试将该语句映射到原始T-SQL,因为
NumWheels
不是数据库列,所以它无法这样做

要克服这一点,您可以先对其执行
ToList
,但如果执行此操作,请注意性能影响。此代码将在整个
Cars
表中循环,并在内存中进行过滤。然而,我想不出其他方法来实现你的目标

var dataByWheels = this.Db.Cars.ToList().Where(v => (v.NumWheels == 4));

那么,
演员为什么会出现在那里呢?如果您删除了它,它为什么不能正常工作?数据库表中根本没有
NumWheels
,如果我要查询它,我需要cast从类定义中访问
NumWheels=4
,那么为什么
cast
在那里?如果您删除它,它为什么不能正常工作?数据库表中根本没有
NumWheels
,如果我要查询它,我需要cast从类定义中访问
NumWheels=4
,至少您可以使用
AsEnumerable
而不是
ToList
在客户端进行过滤,但允许延迟执行,并避免将所有项一次拉入内存。您还可以减少创建新列表只是为了丢弃它而产生的无意义开销。感谢@Servy,我没有意识到这种方法。至少您可以使用
AsEnumerable
而不是
ToList
在客户端进行筛选,但允许延迟执行,并避免将所有项目一次拉入内存。您还可以减少创建新列表而放弃它的无意义开销。谢谢@Servy,我不知道这种方法。