【发布时间】:2012-12-16 16:40:16
【问题描述】:
我正在使用 Julie Lerman 的 DbContext 书中的 BAGA 代码。我想在 LINQ 中重新创建以下 SQL 查询并将结果放入 List 集合中并且遇到问题。 http://learnentityframework.com/downloads/
SELECT * FROM baga.Locations d
LEFT JOIN Lodgings l ON d.LocationID = l.destination_id
WHERE d.Country = 'usa'
AND (l.MilesFromNearestAirport > 5 or l.MilesFromNearestAirport is null)
因此,用英语,获取位于美国的所有位置(目的地),并包括 MilesFromNearestAirport > 5 的所有相关住宿
语法无法编译,但我希望类似于下面的内容
var dests = context.Destinations
.Where(d => d.Country == "USA" && d.Lodgings.Where(l => l.MilesFromNearestAirport > 5))
.Select(d => d)
.ToList();
有什么想法吗?
【问题讨论】:
-
方法不对,因为左连接。你需要做一些类似的事情: .Where(d => d.Country == "USA" && (d.Lodgings.Count == 0 || d.Lodgings.Any(l => l.MilesFromNearestAirport == null || l.MilesFromNearestAirport > 5)) 这应该检索正确的位置。访问住宿时,需要使用 lodgings where 子句中的相同表达式来检索适用的住宿。据我所知,实体框架仅支持内部连接. 另一方面,这个查询在 nhibernate 中非常简单。
-
这些解决方案都不起作用。 Shelkel,你用过 NHibernate 很多吗?你会推荐它而不是 EF 吗?
-
只是好奇...为什么在这里需要 .Select(d => d)。如果你删除它,它只是一个直接的 lambda 表达式,可能会起作用。另一个快速问。这取决于个人喜好,但您可以关闭 && 部分的方括号并将 && 替换为另一个 .Where(...)。
-
我写这篇文章已经有一段时间了,但是我的原始代码不起作用,我只是在学习 Linq,所以请忽略它!我现在可能会使用某种带有 where 子句的 groupjoin 来表示 null & > 5。原来的 Select(d => d) 对我来说似乎毫无意义;-)
标签: c# .net entity-framework linq-to-entities