2017-04-03 18 views
2

我想通過不調用10.000次(實際編號)相同的查詢來優化我的查詢調用。C#Linq multi OR

var myObject= _db.myObject.FirstOrDefault(x => x.property1 == param1 && x.property2 == param2 && x.property3 == 3); 

所以我想

讓我們通過myOtherObject的列表功能。 myOtherObject包含通常填充param1,2和3的字段。

在普通查詢中,我將在foreach中創建一個字符串並將其連接。像這樣:

  // WHERE (property1 = param1 && property2 = param2 && property3 = param3) OR (property1 = param1 && property2 = param2 && property3 = param3) OR (property1 = param1 && property2 = param2 && property3 = param3) 

我該如何在LINQ中實現(如果可能)。 是否有可能連接多個OR

Ofcourse我試着concat任何和嘗試在哪裏,但沒有工作,因爲它創建AND語句(邏輯)。

語境

我在我自己的數據庫中的對象。我需要比較數據庫中的另一個對象,我只有只讀訪問權限。我可以在3個參數的組合上匹配這兩個對象。

INPUT

列表對象A的(其中必須匹配所需的3場)

輸出

從其他(只讀)數據庫,我想列出匹配對象的

+1

爲什麼不在數據庫中創建參數化存儲過程並使用它?這是一個完美的用例。 – Robert

+0

我只能從這個數據庫讀取。我不確定存儲過程是否會被接受。感謝您的想法! – JochemQuery

+0

不好意思說,但沒有把你想要的輸出作爲輸入,當你問一個問題時,總是試着專注於你的輸入/輸出,什麼能讓我們知道你做了什麼以及我們該怎麼做。 –

回答

0

爲了將來在面臨這個問題的人:我解決了這個使用LINQ包含

public async Task<List<MyObject>> GetMyObjectByListOfStrings(List<string> search) 
    { 
     var myObjects = await _db.Entity.Where(x => search.Contains(x.param1+ x.param2+ x.param3)).ToListAsync(); 
     return myObjects; 
    } 

可能有更好的選擇,應改變設計或應改爲固定的實際問題。

1

雖然您可以使用System.Linq.Expressions APIs爲LINQ構建表達式,但根據目標數據庫中各個屬性的選擇性,更簡單的方法可能會有效。

首先,注意發現匹配的一組內存中對象的任務很簡單,如果另一組也在內存:

// Type parameters of Tuple<,,> depend on the types of Prop1..Prop3 
var expect = new HashSet<Tuple<string,string,string>>(
    targetList.Select(item => Tuple.Create(item.Prop1, item.Prop2, item.Prop3)) 
); 
var matches = sourceList 
    .Where(item => expect.Contains(Tuple.Create(item.Prop1, item.Prop2, item.Prop3))) 
    .ToList(); 

由於上述不會在數據庫中搜索工作考慮一個兩階段的方法:

  1. 讀取數據庫中查找所有可能的匹配與「假陽性」
  2. 篩選出使用上述方法誤報。

您可以通過查詢各個參數,這樣得到誤報的項目清單:

var p1List = targetList.Select(item => item.Prop1).ToList(); 
var p2List = targetList.Select(item => item.Prop2).ToList(); 
var p3List = targetList.Select(item => item.Prop3).ToList(); 
var preliminary = dbContext.BigTable 
    .Where(item => p1List.Contains(item.Prop1) 
       && p2List.Contains(item.Prop2) 
       && p3List.Contains(item.Prop3)) 
    .AsEnumerable(); 

爲DB查詢削去列表以不到十這種方法將作爲長期工作乘以實際結果的大小,因爲內存查詢在其CPU使用率方面非常有效(其效率是O(M + N),其中M是具有誤報的列表大小,並且N是目標列表的大小。

+0

謝謝您的信息! – JochemQuery

+1

@JochemQuery不客氣!我很好奇你是否有機會嘗試一下,如果這種方法取得成功? – dasblinkenlight

+0

我今天考試而不是實習(我通過:)),所以我沒有檢查。我不確定何時嘗試這種方法,但我會在此更新 – JochemQuery