查询适用于MSSQL,但不适用于LINQ

时间:2013-12-05 15:52:27

标签: c# sql sql-server linq

我有一个接收组或用户(电子邮件)名称的方法,并且必须返回组或用户的Abstract_Entity对象。

MSSQL查询似乎适用于所有情况,但LINQ查询唯一有效的时间是字符串是用户的电子邮件。

TranslateUserOrGroup(字符串名称):Abstract_Entity

你们看到MSSQL查询和LINQ代码有什么不同吗?

LINQ查询

return (from e in complementCoinsEntities.Abstract_Entity.AsNoTracking()
     join eg in complementCoinsEntities.Entity_Group on e.ID equals eg.entityID
     join g in complementCoinsEntities.Group on eg.groupID equals g.ID
     join u in complementCoinsEntities.User on e.ID equals u.userID
     where userOrGroup == u.email || userOrGroup == g.name 
     select e).SingleOrDefault();

MSSQL查询

select DISTINCT ae.ID
from Abstract_Entity ae
join Entity_Group eg on ae.ID = eg.entityID
join [Group] g on eg.groupID = g.ID
join [User] u on ae.ID = u.userID
where g.name = 'test' OR u.email = 'test'

enter image description here

2 个答案:

答案 0 :(得分:2)

我首先将立即窗口中的结果剥离SingleOrDefault和ToList(),以查看返回的查询结果。您可能正在剥离尝试使用SingleOrDefault而不是DISTINCT的匹配行。它们的功能不同。因此,在SQL查询中删除'DISTINCT'并删除SingleOrDEfault调用,并分配给一个对象并运行ToList并放置一个断点。你应该看到有什么不同。

具体来说:SingleOrDefault可能会锁定多个结果,但您无法保证获得任何特定结果(包括空结果)。

答案 1 :(得分:0)

.SingleOrDefault()
  

返回序列的唯一元素,如果序列为空,则返回默认值;如果序列中有多个元素,则此方法抛出异常。

你试过.FirstOrDefault()吗?