2016-03-05 50 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