c# - 为什么这个 Linq-to-SQL 查询在执行 Where 子句时不转换对象?

标签 c# windows-phone-7 linq-to-sql

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

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

IVehicle 在这种情况下是一个接口(interface),它定义类必须具有 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

这意味着它没有执行 th cast。当我在 Cast 之后将 ToList() 插入链中时,它确实有效,但我想这是过早地解析查询并创建整个表的巨大列表,我想避免因为我正在打电话。

我做错了什么?

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

最佳答案

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

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

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

关于c# - 为什么这个 Linq-to-SQL 查询在执行 Where 子句时不转换对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16222834/

相关文章:

sockets - window 电话 7 : Socket Programming

C#、Linq2SQL : Building up expressions

c# - LINQ to SQL 中的内部连接不起作用

c# - 我的数据库连接关闭了吗? (Linq to Sql)

c# - OpenHtmlToPdf 访问被 ASP.NET 拒绝

c# - 如何在报表查看器中设置页边距?

c# - 使用 WebRequest 发布

c# - 如何在 Window Phone 中捕获电话通话状态

c# - 如何使用 LINQ 查找包含 2 个逗号分隔字符串的匹配项

c# - 计算2个数组有多少位置包含相等的元素