- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Entity Framework Core 和 Linq 编写查询以获取我对象上的 EndDate 属性为 NULL 的所有条目。但是,EF 不会将查询转换为正确的 SQL 以过滤掉 EndDate 不为 NULL 的对象。我正在使用带有这些包的 MySQL 数据库:
"MySql.Data.Core": "7.0.4-IR-191",
"MySql.Data.EntityFrameworkCore": "7.0.4-IR-191",
这是我的查询:
var employees = (from emp in _context.Employees.ToList()
join loc in _context.Locations.ToList()
on emp.HomeLocationId equals loc.LocationId
join rate in _context.EmployeeRates.ToList()
on emp.EmployeeId equals rate.EmployeeId
where rate.EndDate == null
select emp).ToList();
这是我的 EndDate 属性声明:
public DateTime? EndDate { get; set; }
生成的 SQL 根本不包含 WHERE 子句。我已将此查询手动转换为 MySQL,并且运行良好:
SELECT e.FirstName, e.LastName, er.Rate, er.StartDate, er.EndDate
FROM qasdb.employees as e
JOIN qasdb.employeerates as er on er.EmployeeId = e.EmployeeId
JOIN qasdb.locations as l on l.LocationId = e.HomeLocationId
WHERE e.FirstName='Todd' AND er.EndDate is null
这是 EF Core 的问题吗?是否有已知的变通方法可以使 Null 比较起作用?
编辑
这是生成的 SQL。它看起来在做几个查询:
SELECT e.EmployeeRateId, e.EmployeeId, e.EndDate,
e.LastModifiedBy, e.Rate, e.StartDate FROM employeerates
AS e
SELECT emp.EmployeeId, emp.ActiveFlag, emp.City,
emp.CreateStamp, emp.Email, emp.EmergencyContactName,
emp.EmergencyContactPhone, emp.FirstName,
emp.HomeLocationId, emp.JobClass, emp.LastModifiedBy,
emp.LastName, emp.PhoneNumber, emp.Ssn, emp.State,
emp.Street, emp.UpdateStamp, emp.Zip FROM employees
AS emp
INNER JOIN locations AS loc ON emp.HomeLocationId = loc.LocationId
编辑#2
当我从每一行中删除 ToList() 调用时,将按预期生成 SQL:
SELECT emp.EmployeeId, emp.ActiveFlag, emp.City,
emp.CreateStamp, emp.Email, emp.EmergencyContactName,
emp.EmergencyContactPhone, emp.FirstName,
emp.HomeLocationId, emp.JobClass, emp.LastModifiedBy,
emp.LastName, emp.PhoneNumber, emp.Ssn, emp.State,
emp.Street, emp.UpdateStamp, emp.Zip FROM employees
AS emp
INNER JOIN locations AS loc ON emp.HomeLocationId = loc.LocationId
INNER JOIN employeerates AS rate ON emp.EmployeeId = rate.EmployeeId
WHERE rate.EndDate IS NULL
但是,当我删除 .ToList() 调用时,我丢失了从 Employee 对象到 EmployeeRates 列表的导航属性。以下是我的员工实体的设置方式:
public class Employee : BaseEntity
{
public int EmployeeId { get; set; }
......
public string JobClass { get; set; }
public int HomeLocationId { get; set; }
//Navigation Properties
public virtual Location HomeLocation { get; set; }
public virtual List<EmployeeRate> EmployeeRates { get; set; }
}
在删除 ToList() 调用后,HomeLocation 和 EmployeeRates 对象都返回“null”。
最佳答案
您的第一个查询在每个 DbSet 之后包含 ToList()
,这会将所有这些表中的所有数据带到内存中。每当调用 ToList()
时,EF 都会执行查询。因此,即使您一起编写了整个 linq 查询,EF 也有 3 个小查询要在那里处理(加载每个 DbSet),因此您会得到 3 个不同的查询被发送到数据库。 EF 将从这些查询生成实体集合,其他所有内容都将在客户端进行评估,因此您看不到 where 子句被转换为服务器,因为它根本不是提供给 EF 的查询的一部分。在此解决方案中,您可以看到加载的导航属性,因为所有数据都加载到内存中,然后 EF 将修复导航属性以填充它们。 (这样内存中的所有数据都处于一致状态。)
当您从所有 DbSet 中删除 ToList()
调用时,它将变成一个传递给 EF 的查询。 (最后一个 ToList()
调用执行)因此 EF 将处理查询并翻译 where 子句,但由于您只投影出 Employee
对象,因此 EF 将仅获取属性它不会检索任何相关数据。如果您想填充导航属性,即加载相关数据,则必须使用 Include
语法明确告诉 EF。
您要查找的查询是
var result = (from e in db.Employees.Include(e => e.HomeLocation).Include(e => e.EmployeeRates)
join er in db.EmployeeRates on e.Id equals er.EmployeeId
where er.EndDate != null
select e).ToList();
对于您希望在最终结果中填充的每个导航,查询都有 Include
。由于过滤包含在 EF 中仍然不受支持,(请参阅 https://github.com/aspnet/EntityFramework/issues/1833)您不能直接在 rate.EndDate
上指定 where 子句。因此,您需要手动加入该表并在 EndDate
上应用 where 条件。由于 HomeLocation
是一对一导航,因此 EF 将仅在主查询中为其检索相关数据(以填充导航)。 EmployeeRates
是集合导航,因此 EF 将发送单独的查询以加载相关员工的相关数据。重要的一点,您不需要手动加入 HomeLocation
。 include 会为你做到这一点。您需要手动加入 EmployeeRate
仅用于过滤。
以下是SQL生成的主要查询
SELECT [e].[Id], [e].[HomeLocationId], [l].[Id]
FROM [Employees] AS [e]
INNER JOIN [EmployeeRates] AS [er] ON [e].[Id] = [er].[EmployeeId]
INNER JOIN [Locations] AS [l] ON [e].[HomeLocationId] = [l].[Id]
WHERE [er].[EndDate] IS NOT NULL
ORDER BY [e].[Id]
关于mysql - Entity Framework Core Linq NULL 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41065494/
给出数据库表中的以下信息: Col 1, Col2, Col3 1 , x , G 1 , y , H 2 , z , J 2 , a , K 2 , a
linq 的一般缺点是什么。 最佳答案 刚开始使用时可能很难理解 延迟执行可以将错误与其原因(在时间方面)分开 进程外 LINQ(例如 LINQ to SQL)总是有点漏洞百出的抽象——你需要知道什么
当我使用 LINQ Where 子句时,返回的项目列表是否遵循它们在原始列表中的顺序? 最佳答案 这取决于被查询的集合如何拥有它的 GetEnumerator被执行。如 GetEnumerator按照
在 Linq 中进行连接时,例如 from c in customers join x in somelistofcustomers on x.Id equals c.Id 你会得到错误 x is n
我正在使用 LINQ 来查询数据。考虑用户只想报告 3 个字段中的 1 个的情况? (见下文) 谁能告诉我如何动态构建查询? 谢谢 DD var query = from cl in db.t
假设我们有下表: Person: PersonID, Name, Age, Gender 并且我们提供了一个搜索功能,允许用户根据名称 来搜索表。和/或 年龄。 编写 SQL(或 LI
这应该很容易。 我要检查两个列表是否相同,因为它们包含所有相同的元素,顺序不重要。 重复的元素被认为是相等的,即new[]{1,2,2}与new[]{2,1}相同 最佳答案 var same = li
假设我有一个数组,我想对varchar进行LINQ查询,该查询返回在varchar中任何位置具有数组元素的任何记录。 这样的事情会很甜蜜。 string[] industries = { "airli
我正在努力寻找 LINQ orderby 示例,其中数据按列索引排序。这是可能的吗? 谢谢 最佳答案 LINQ 中没有列这样的概念,只有字段和属性。您的意思可能是在您创建的匿名类型中指定属性的索引:
我有一个类项目。 class Item{ public int Id { get; set; } public DateTime CreatedDate { get;
我有一张 table 叫做产品。我想获取 productID 为 2 OR 6 OR 9 的所有产品 SQL 是:Select * from products where productID=2 OR
使用时 Contains对于 Linq-to-objects 上的动态 Linq,搜索区分大小写。我希望能够搜索不区分大小写的(如 Linq-to-sql,因为 SQL 服务器默认执行此操作)。 就像
有人能告诉我如何将此查询转换为 linq 吗? SELECT dpr_ts ,dpr_close ,nvl((SELECT pay.pay_dividend
我正在使用linq to实体(EF)。 我有一个采用4个字符串参数的构造函数。根据什么参数不为null,我必须构建linq查询。我可以使用if else语句,但是在这种情况下,我还有其他带有10个参数
下面是我的代码的简化版本。我希望 p1和 p2是平等的,还有p1_after和 p2_after是相等的,因为 GetPerson1() 之间的唯一区别是和 GetPerson2()是 .ToList
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
我看到一些代码是 linq 用于遍历 c# 中的字典对象。我认为 linq 只是用于 linq 到 sql 的数据库。提到的代码中使用的 linq 是一个选择类型的语句,只是没有数据库。 有没有 li
我刚刚开始在一个中型项目中使用LINQ to SQL,并且想加深我对L2S提供的优势的理解。 我看到的一个缺点是它增加了另一层代码,我的理解是,它的性能比使用存储过程和ADO.Net慢。似乎调试也可能
可绑定(bind) LINQ 和连续 LINQ 之间的主要区别是什么? •可绑定(bind)LINQ:www.codeplex.com/bindablelinq • 连续 LINQ:www.codep
Linq 中没有内置全文搜索,而且似乎没有很多关于该主题的帖子,所以我玩了一下,并为我的实用类想出了这个方法: public static IEnumerable GenericFullTextSea
我是一名优秀的程序员,十分优秀!