在LINQ使用'新'运营商的SQL查询,但相同的实例在每一个结果被引用

谁能解释我在下面的最少的代码示例看到的行为? 看来,对于给定的字段或属性,在同样的两个实例Entry级被重用在LINQ to SQL查询的每一次迭代,即使我用的是new运 ​​营商。 同样的问题不会对LINQ显示为对象的查询。 我创建使用.NET Framework 4,并连接到SQL Server 2005企业数据库中的C#控制台应用程序项目。

public class Set { public Entry Field; public Entry Property { get; set; } } public class Entry { public int ID; public string Name { get; set; } } class Program { static void Main(string[] args) { var dc = new DataClasses1DataContext(); // just create a simple dbml with some table from some database var resultQuery = ( from x in dc.SomeTable select new Set() { Field = new Entry(), Property = new Entry() } ); var sets = resultQuery.ToArray(); Test(sets); var source = Enumerable.Range(0, 10); var sourceQuery = ( from x in source select new Set() { Field = new Entry(), Property = new Entry() } ); var sets2 = sourceQuery.ToArray(); Test(sets2); } static void Test(Set[] sets) { var f = sets[0].Field; Console.WriteLine(sets.All(x => object.Equals(x.Field, f))); var p = sets[0].Property; Console.WriteLine(sets.All(x => object.Equals(x.Property, p))); Console.Writeline(sets.Length); Console.WriteLine(object.Equals(f, p)); Console.WriteLine(); } }

的输出Test()的LINQ to SQL的查询

True True 1362 False

这表明,对于所有的Set生产出来的物品,所有的Field成员指向同一个Entry实例和所有Property成员指向同一个Entry实例。 即,相同的实例重新用于在查询的每次迭代相应部件。

的输出Test()的LINQ的对象查询

False False 10 False

这表明一个新不同实例在查询的每个迭代创建。

是的LINQ to SQL行为预期的或错误? 有谁知道,如果发生这种情况与实体框架?

--------------解决方案-------------

我不知道这是否是一个错误,或者为什么这个有望在LINQ到SQL。 我只能回答你的最后一个问题,如果还与实体框架发生。

答案是:没有。

与EF你当你实例化使用对象初始化语法虽然Entry的对象。 使用默认的构造函数导致一个例外:

var resultQuery = (
from x in dc.SomeTable
select new Set
{
Field = new Entry { Name = "X" },
Property = new Entry { Name = "X" }
}
);

不要紧,你如何初始化。 使用以上(和在一个小测试表4行)我得到你的测试程序这个输出的代码:

False
False
4
False

False
False
10
False

它看起来是有LINQ之间SQL和Entity Framework有关预测期间对象具体化有很大的区别。

(我和EF 4.1 /的DbContext测试。)

编辑

如果我把修改后的查询在我的代码片段上面也为您的LINQ to SQL查询和观看生成的SQL,我得到以下几点:

SELECT NULL AS [EMPTY]
FROM [dbo].[SomeTable] AS [t0]

而使用LINQ到entites的同一创建此查询:

SELECT
1 AS [C1],
N'X' AS [C2],
N'X' AS [C3]
FROM [dbo].[SomeTable] AS [Extent1]

我的解释是,LINQ to SQL的解析投影代码和查询只对依赖于“行变量”x属性值的列。 所有其他属性都充满在客户端上,当物体得到兑现。 如果一个对象不依赖于列值可言,LINQ to SQL中创建一个单一的常量对象和重用它整个结果收藏。

在constrast这个实体框架也将常数值(x无关)到数据库服务器。 值获得发送回客户端和EF把这些值,好像他们是列值,并更新在投影的对象的属性。

这也导致了较大的差异这样的事情......

Random random = new Random();
var resultQuery = (
from x in dc.SomeTable
select new Set
{
Field = new Entry { ID = random.Next() },
Property = new Entry { Name = "X" }
}
);

......在LINQ作品SQL,因为很明显的随机函数值(这是独立于X)在客户端上进行评估,然后分配给属性。 但是EF想属性赋值的右边转化为SQL并将其作为SQL片段到数据库服务器-这失败,导致了臭名昭著的“......能不能转化成店表达...”异常。

编辑2

BTW:最后的代码片断上面仍然只创建一个单一的Field ,整个集合中的实例: random.Next()只计算一次(也是的构造函数Entry只对调用一次Field对象)。 现在,这的确是令人困惑,因为写这样的代码人们所期望的,你想为从数据库返回的每一行的随机值。 这不是个案。

分类:实体框架 时间:2012-01-01 人气:1
分享到:

相关文章

  • 当将LINQ to SQL中被淘汰? 是实体框架(更换)​​公布了吗? 2012-02-04

    当将LINQ to SQL中被淘汰? 是实体框架(更换)​​公布了吗? --------------解决方案------------- 是的,ADO.NET实体框架已经发布了与.NET 3.5的Service Pack 1. 不,实体框架将不会取代LINQ-2-SQL本身 - 这两个具有完全不同的目标受众,并有自己的,各自的目标市场. LINQ-2-SQL是伟大的,更简单的场景,你的业务对象是几乎是1:1的映射数据库表. 这是经常发生的情况,并且在这样的情况下,EF是矫枉过正. EF,另一方面是

  • 在实体框架4简单的条件LINQ查询 2014-11-11

    我最近迁移此代码实体框架4,它是失败的. 显然,如果状态不具有价值,回报所有的匹配,如果确实有一个值匹配的人在那里user.StatusID == 1 . return users.SingleOrDefault( user => user.Username == username && user.EncryptedPassword == password && (!status.HasValue || user.StatusID == 1) ); 异常返回: Arg

  • LINQ to SQL的:如果我添加一个对象到LINQ实体集不它被添加 2012-03-06

    比方说,我有一个公司表和分区表. 每个事业部有一个外键,一个公司,所以每家公司可以有多个分部孩子. 如果我抢使用LINQ到SQL一个Company对象我要成为一个访问的部门属性,司对象的实体集. 如果我添加一个新的事业部对象,并调用的SubmitChanges()将不会自动进入分区表还是我不得不打电话InsertOnSubmit? --------------解决方案------------- 有多种方法将对象插入使用LINQ数据库SQL. 例如: db.Divisions.InsertOnSu

  • 如何连接在LINQ to SQL中的字段 2013-07-11

    我想实现在LINQ to SQL以下SQL查询. SELECT TOP dbo.SiteDept.SiteDeptId, dbo.Site.SiteName + ' / ' + dbo.Dept.DeptName AS SiteDeptName, dbo.SiteDept.SiteId, dbo.SiteDept.DeptId, dbo.Dept.DeptName FROM dbo.SiteDept INNER JOIN dbo.Site ON dbo.SiteDept.SiteId = dbo

  • 是否LINQ to SQL的自动延迟加载相关的实体? 2014-06-07

    是否LINQ to SQL的自动延迟加载相关的实体? 我认为这将,但是我无法找到一篇文章,说明它是这样. --------------解决方案------------- 是的,我相信它. 它也有一个"负载"功能/语义,可以让你批量加载几件事情在一个试探性的方法. 当你知道你需要的相关数据以及主要实体马上蝙蝠,喜欢预先缓存中的所有数据,你需要使一个单一的网页等,这是非常有用的 这取决于你如何定义"延迟加载". 如果你说 var person = (from p in

  • 在LINQ to SQL中我怎么包括初始查询子实体? 2014-07-12

    我希望能够包括在我的LINQ to SQL查询的主要实体的子实体. Public Function GetEmployees() As IEnumerable(Of Employee) Dim dc As New MyDataContext() Return From e In dc.Employee End Function 在我的ASPX页面,我想显示每个员工的部门没有它不必回去每次需要的部门名称从部门实体的每一个员工的每一次查询数据库. <asp:repeater...> ... <

  • LINQ to SQL中指定的转换与联盟有效的错误 2014-08-02

    我有一个使用LINQ到SQL在.NET 4.0 agains一个SQL Server 2008 R2服务器下面的代码: public void Patients() { var documents = GetEMRDocumentsByPatientId("231966"); if (documents.Count() > 0) { foreach (var doc in documents) { Console.WriteLine(doc.PatientId); } } } p

  • 缺少LINQ的命名空间(LINQ to SQL中,紧凑架构) 2014-10-18

    我在试图找出其中的system.linq.expressions命名空间是花了今天上午. 下面是我做的: 在VS 2008中,创建一个新的C#/智能设备/ Windows Mobile 6专业SDK / .NET CF V3.5 /类库 二手SqlMetal(在程序文件/微软的SDK /窗/ v6.0A /斌)生成的数据上下文. 新增的数据上下文cs文件到项目中. 编译和失踪的命名空间许多错误:System.Data.Linq程序,System.Data.Linq.Mapping,System.

  • LINQ to SQL中的GridView的空值 2012-02-05

    通常情况下,如果我连接一个ObjectDataSource到GridView和我有一个TemplateColumn中,有一个eval在它和它的空,我就可以把一个"的ToString()",它工作正常. 出于某种原因,这不,当你使用LINQ to SQL的工作方式相同. 我原本是用XSD文件为我的DAL使用自定义BLL. 我把它系在同一个ObjectDataSource的GridView控件. 我在换出与LINQ to SQL中的XSD文件中,一切工作就像旧的方式,除了可以有NULL值的

  • 如何LINQ to SQL中使用SQL连接的工作原理? 2012-02-25

    什么是使用LINQ的数据环境中工作的最佳方法是什么? 以及如何使用SQL连接(什么时候才能打开连接,它什么时候关闭连接)做链接的工作? 我应该aloways使用using语句时,我的工作与数据上下文? 对不起,我的问题清单. 提前致谢. --------------解决方案------------- 有很多在这里介绍 - 我给你我的盆栽观 - 然后给你一些链接等,以帮助您进一步. 周围有这个网站的许多其他类似的问题还有,虽然 - 所以做一个搜索,你会发现更多. 一生 你并不需要使用 using语

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.162 (s). 10 q(s)