不知道为什么将其链接为骗子。问题是不同的。答案是不同的。不知道要更改什么。如果有人看到我想念的东西,请告诉我...
使用这两个查询,我得到的结果数量不同。在分析了几个小时之后,我需要投入毛巾,承认我无法发现重要性的差异。由于我的方法库已空荡荡,因此我需要帮助。
LINQ
List<Uno> result = context.Unos
.Join(context.Duos, uno => uno.CommonId, duo => duo.CommonId,
(uno, duo) => new { Uno = uno, Duo = duo })
.Where(item => item.Uno.Amount > 0
&& item.Duo.Type == 2)
.Select(item => item.Uno)
.ToList();
的SQL
select * from Uno as u
join Duo as d on d.CommonId = u.CommonId
where u.Amount > 0
and d.Type = 2
第一个问题是上述两个陈述是否确实相等,或者我是否缺少某些内容。第二个问题是我所缺少的(如果有的话)或如何解决它(如果我没有的话)。
我还能验证什么?
在社区的大力支持下,我们确定可以通过以下命令对LINQ查询进行SQL化。
var wtd = context.Unos
.Join(context.Duos, uno => uno.CommonId, duo => duo.CommonId,
(uno, duo) => new { Uno = uno, Duo = duo })
.Where(item => item.Uno.Amount > 0
&& item.Duo.Type == 2)
.Select(item => item.Uno)
.ToString();
疯狂的事情是,在SQL Manager中执行该字符串会产生142个结果(就像上面示例中的查询一样,是SQL版本),并且与它的区别不大。但是,执行LINQ查询本身会产生1437个结果。我太困惑了,连哭都没有...
“ SELECT \ r \ n [Extent1]。[CommonId] AS [CommonId],\ r \ n [Extent1]。[X] AS [X] \ r \ n FROM(SELECT \ n [Uno]。[CommonId] AS [CommonId],\ n [Uno]。[X] AS [X] \ n FROM [财务]。[Uno] AS [Uno])AS [Extent1] \ r \ n内部联接(选择\ n [Duo]。 [CommonId] AS [CommonId],\ n [Duo]。[Y] AS [Y],\ n [Duo]。[Z] AS [Z],\ n [Duo]。[Type] AS [Type], \ n [Duo]。[U] AS [U],\ n [Duo]。[V] AS [V] \ n FROM [Finance]。[Duo] AS [Duo])AS [Extent2] ON [Extent1] 。[CommonId] = [Extent2]。[CommonId] \ r \ n其中([Extent1]。[X]> cast(0为十进制(18)))AND([Extent2]。[类型] = @ p__linq__0)”
在Entity Framework中映射视图时,经常会发生这种情况。与常规数据库表不同,视图通常没有明显唯一的键值。当EF遇到具有相同主键值的行时,它仅复制属于它已经知道的键的行。在联接中,这可能会导致EF产生更多的子记录,因为该第一个已知行的子记录可能比实际数据库的行更多。
解决方法是确保视图具有唯一标识行的字段(或字段组合)。而且,当然,在EF中,应将此映射为(可能是复合的)主键。
我不知道为什么EF会显示这种行为。我认为它应该有可能引发使重复实体具体化的异常。这种“功能”总是引起很多混乱。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句