假设我有{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 编译器不喜欢连接中的匿名类。我明确表示并停止抱怨。我会在早上看看它是否真的有用......
答案 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'...)功能