1

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

var dataByWheels = this.Db.Cars.Cast<IVehicle>().Where(v => (v.NumWheels == 4));

IVehicle在这种情况下,是一个定义类必须具有NumWheels属性的接口。该类Cars类似于如下,

[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

这意味着它没有执行演员表。当我在它确实工作ToList()后将 a 插入链Cast中时,但我想这是过早地解决了查询并创建了整个表的巨大列表,并且我想避免,因为我正在使用电话。

我究竟做错了什么?

(注意我更改了名称和查询以使其更简单)

4

2 回答 2

3

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

为了克服这个问题,你可以先做一个ToList,但要注意如果你这样做会影响性能。此代码将循环遍历整个Cars表并在内存中进行过滤。但是,我想不出另一种方法来实现您的目标。

var dataByWheels = this.Db.Cars.ToList().Where(v => (v.NumWheels == 4));
于 2013-04-25T19:17:47.877 回答
1

问题不在于您的 LINQ,而在于您的使用上下文。这个特定的 LINQ 查询正在 Queryable 上使用,Cast 将强制它转到 DB 并拉回此时的所有结果。然后,您可以对可枚举进行强制转换并继续,但在这种情况下,它很可能不是您要寻找的。

该错误只是表明您编写了一个无法映射到 SQL 并在 SQL 服务器上执行的表达式。这是 EF 的事情,而不是 LINQ 的事情。

于 2013-04-25T19:14:14.863 回答