2016-03-05 63 views
0

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

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

我想出了以下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 

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

UPDATE 我想基于以下建议更新:

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 编译器不喜欢匿名类在加入。我明确表示,并停止抱怨。我会看看它在早上是否真的有效......

+0

这听起来像'城市'和'国家'的类型不匹配在等号的每一边。 – Enigmativity

回答

4

它在我看来,你需要这样的:

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; 
+0

首先,我喜欢它比我更好。所以,即使我没有好转 - 这仍然是一个改进。 *但是*我仍然需要到数据库中查看我已有的值。而且,正如我之前提到的 - 如果我**不在数据库中拥有这些值(比如说,它们是从客户端发送的),该怎么办?所以我试图扩展你的建议,其中位置是一个List,而不是一个表,并且我得到了一个错误。我会更新原始问题以保持格式化。如果你可以评论 - 这将是伟大的!谢谢 – Felix

1

好吧,你可以做的事情不多,只要你依靠查表,你可以做的唯一一件事就是加速最后的事情是把一个指标放在城市和州。

LINQ的语句翻译成一个有效的SQL语句,其中“所有”将转化为类似:

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( '值1', '值' ...)功能,您正在寻找

+0

谢谢。这就是我害怕的;)但是,如果我没有* LocationID?假设,城市/州的名单来自一些HTTP Post?是循环访问列表值的唯一方法吗?很难相信它;更难接受! – Felix

+0

我在检查了一些后更新了。诀窍是将.Any()与.Contains()结合使用,这将为您提供正确的SQL语句。你可以在那里使用你的位置结构。如果它解决了你的问题,别忘了投票:) –

+0

re:你的更新。坦率地说,你在那里失去了我。我知道我说我的例子有点炮火,但你是如何得到客户和名字的?或者,相反,我如何将您的客户/姓名解决方案应用于我的城市/州问题?我不认为有一个有效的'IN('value1','value2'...)'SQL。我**不能在('波特兰','斯普林菲尔德')和'('或','我')中拥有'城市',因为这会给我带来太多的变化...... – Felix