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>
也不尊重隐式转换操作(参见 here 和 here )。当然,这与 LinqToSql 没有任何关系——但原则很重要——.net 转换与 c# 隐式转换和任何 sql 事物都不一样。您必须牢记正在编写的代码的执行环境。关于linq - Cast<T> 是否会导致 IQueryable 在 Linq-to-SQL 中进行评估?它的使用有哪些限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5145074/