Cast 是否会导致 IQueryable 在 Linq-to-SQL 中进行评估?

它的使用有哪些限制?

似乎我为记录创建了一个显式转换为域对象,例如:

  IQueryable<TSqlRecord> q;
  var cast = q.Cast<TDomainObject>();

那么我应该得到一个错误,因为Linq-to-Sql显然无法处理域对象构造函数。

但是,我可以将 IQueryable<TSqlRecord> 转换到它的接口(interface) IHasIntId 而不强制查询进行评估吗?

最佳答案

Cast 被延迟并且不会导致立即执行。这是因为它(本身)不枚举源。只有在枚举某些内容时,才会运行查询。

向上转换是没有问题的。查询将正常工作。

回想一下 - 查询适用于数据库行而不是实例。仅当行到达本地时才创建实例。这个对 cast 的调用所做的只是改变结果中使用的引用类型——它不会改变新创建的实例的类型。

class SpecificObject : DomainObject

MyDataContext myDC = new MyDataContext();
IQueryable<DomainObject> query = myDC.SpecificObjects.Cast<DomainObject>();

Console.WriteLine(myDC.GetCommand(query).CommandText);

但是 - 这并不是很有用 - 因为行上的属性是原始类型,现在您无法在查询的其余部分中引用这些属性。

向下转型并没有多大作用。 LinqToSql 假定每一行都是 Table<T> 中的 T 类型。不是一些TChild。这将生成一个查询,为表中的每一行选择 null。
class SpecificObject : DomainObject

MyDataContext myDC = new MyDataContext();
IQueryable<SpecificObject> query = myDC.DomainObjects.Cast<SpecificObject>();

Console.WriteLine(myDC.GetCommand(query).CommandText);

隐式转换...人们应该非常小心。甚至 LinqToObject 的 Enumerable.Cast<T> 也不尊重隐式转换操作(参见 herehere )。当然,这与 LinqToSql 没有任何关系——但原则很重要——.net 转换与 c# 隐式转换和任何 sql 事物都不一样。您必须牢记正在编写的代码的执行环境。

关于linq - Cast<T> 是否会导致 IQueryable 在 Linq-to-SQL 中进行评估?它的使用有哪些限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5145074/

10-12 23:52