Linq加入两个值

时间:2016-03-05 06:36:29

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

假设我有{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

我觉得必须有更好的东西。对于初学者来说,我已经拥有内存中的城市/州 - 所以回到数据库只是为了让连接看起来非常低效。我正在寻找一些方法来说{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 编译器不喜欢连接中的匿名类。我明确表示并停止抱怨。我会在早上看看它是否真的有用......

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

嗯,你可以做的事情还不多,只要你依赖表查找,你唯一可以做的就是加速城市和州的索引。

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

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

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

编辑:您也可以这样做:

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

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