gpt4 book ai didi

linq - Cast 是否会导致 IQueryable 在 Linq-to-SQL 中求值?它的使用有什么限制?

转载 作者:行者123 更新时间:2023-12-05 01:25:30 25 4
gpt4 key购买 nike

Cast 是否会导致 IQueryable 在 Linq-to-SQL 中求值?

它的使用有什么限制?

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

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

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

但是,我可以投IQueryable<TSqlRecord>吗?到它的界面 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com