【问题标题】:Linq join on two valuesLinq 加入两个值
【发布时间】:2016-06-19 01:40:31
【问题描述】:

假设我有一个{City, State} 的列表。它最初来自数据库,我有 LocationID,但现在我将它加载到内存中。假设我还有一张快餐店表,其中包含城市和州作为记录的一部分。我需要获取与城市和州相匹配的机构列表。

注意:我试图描述一个简化的场景;我的业务领域完全不同。

我想出了以下 LINQ 解决方案:

var establishments = from r in restaurants
from l in locations
where l.LocationId == id &&
      l.City == r.City &&
      l.State == r.State
select r

我觉得一定有更好的东西。对于初学者,我已经在内存中拥有 City/State - 所以返回数据库只是为了进行连接似乎非常低效。我正在寻找某种方式来表达{r.City, r.State} match Any(MyList),其中 MyList 是我收集的城市/州。

更新 我尝试根据以下建议进行更新:

List<CityState> myCityStates = ...;
var establishments =
from r in restaurants
join l in myCityStates
    on new { r.City, r.State } equals new { l.City, l.State } into gls
select r;

我得到以下编译错误: Error CS1941 The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'Join'.

更新 2 编译器不喜欢连接中的匿名类。我明确表示,它停止抱怨。我看看它是否真的在早上有效......

【问题讨论】:

  • 听起来 CityState 的类型在等号的每一边都不匹配。

标签: c# asp.net entity-framework linq


【解决方案1】:

在我看来你需要这个:

var establishments =
    from r in restaurants
    join l in locations.Where(x => x.LocationId == id)
        on new { r.City, r.State } equals new { l.City, l.State } into gls
    select r;

【讨论】:

  • 首先,我比我更喜欢它。所以,即使我没有变得更好——它仍然是一种进步。 但是我仍然需要去数据库中获取我已经拥有的值。此外,正如我之前提到的 - 如果我在数据库中完全没有这些值(例如,它们是从客户端发布的)怎么办。因此,我尝试将您的建议扩展到位置是列表而不是表格的位置,但出现错误。我将更新原始问题以保持格式。如果您可以发表评论-那就太好了!谢谢
【解决方案2】:

好吧,您能做的不多,只要您依赖表查找,您唯一能做的加快速度的就是在 City 和 State 上放置一个索引。

linq 语句必须转换为有效的 SQL 语句,其中“Any”将转换为:

SELECT * FROM Restaurants where City in ('...all cities')

我不知道其他 ORM 是否为这些类型的场景提供更好的性能,但它可能值得研究。 EF 从未有过关于读取速度快的谣言。

编辑:您也可以这样做:

List<string> names = new List { "John", "Max", "Pete" };
bool has = customers.Any(cus => names.Contains(cus.FirstName)); 

这将产生您正在寻找的必要 IN('value1', 'value2' ...) 功能

【讨论】:

  • 谢谢。这就是我所害怕的 ;) 但是如果我 没有 有 LocationID 怎么办?假设 City/State 的列表来自某个 HTTP Post?是循环遍历列表值的唯一方法吗?很难相信;更难接受!
  • 我在检查了一些之后更新了。诀窍是将 .Any() 与 .Contains() 结合使用,这将为您提供正确的 SQL 语句。您可以在那里使用您的位置结构。如果它解决了您的问题,请不要忘记投票:)
  • 回复:您的更新。坦率地说,你在那里失去了我。我知道我说过我的例子有些捏造,但你是如何找到客户和名字的?或者,更确切地说,我如何将您的客户/名称解决方案应用于我的城市/州问题?我认为没有有效的IN('value1', 'value2'...) SQL。我不能拥有City in ('Portland', 'Springfield') AND State in ('OR', 'ME'),因为这会给我太多的排列...
  • 客户、产品、名称,没关系。我在这里教你如何钓鱼,而不是给你鱼:)从我的回答中的概念,你应该明白你需要做什么:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2021-07-23
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多