linq小记
添加到 Table 的对象不在标识缓存中。标识缓存仅反映从数据库中检索到的内容。调用 InsertOnSubmit 后,直到 SubmitChanges 成功完成,所添加的实体才会出现在对数据库的查询中。
运行库中的对象具有唯一标识。引用同一对象的两个变量实际上是引用此对象的同一实例。因为这一事实,您通过一个变量做出更改后,立即就可以通过另一个变量看到这些更改。
对于对象,您的期望则大不一样。您期望在您反复向 DataContext 索取相同的信息时,它实际上会为您提供同一对象实例
在此示例中,如果您执行同一查询两次,则您每次都会收到对内存中同一对象的引用。
Customer cust1 =
(from cust in db.Customers
where cust.CustomerID == "BONAP"
select cust).First();
Customer cust2 =
(from cust in db.Customers
where cust.CustomerID == "BONAP"
select cust).First();
避免在插入或更新时显式设置数据库生成的值
问:我的一个数据库表具有一个默认为 SQL Getdate() 的 DateCreated 列。在我试图使用 LINQ to SQL 插入新记录时,该值会设置为 NULL。我希望其设置为数据库默认值。
答:LINQ to SQL 会自动为标识(自动增加)和 rowguidcol(数据库生成的 GUID)以及时间戳列处理这种情况。在其他情况下,您应手动设置 IsDbGenerated=true 和 AutoSync=Always/OnInsert/OnUpdate 属性。
同样,使用经 LINQ to SQL 转换后的 Average 计算整数值时,所得结果的数据类型为 integer,而非 double。
并且使用 Sum 计算空序列或只包含 null 的序列时,所得结果为 null 而非零。
LINQ to SQL 允许在 GroupBy 和 OrderBy 方法中使用实体类型。在这些运算符的转换过程中,使用一种类型的参数被视为等效于指定该类型的所有成员。例如,下面的代码是等效的:db.Customers.GroupBy(c => c);
db.Customers.GroupBy(c => new { c.CustomerID, c.ContactName });
具体而言,您不能对包含映射到 text 或 ntext 列的成员的任何结果使用 Distinct()。