2016-12-06 133 views
1

我有一個模型列表,我填充項目。下面的列表包含項目: -Linq查詢匹配多個參數

List<Entry> list = new List<Entry> 
{ 
    new Entry { EmployeeId = 1, EntryDate = '2016-11-01', InDate = '2016-11-01' }, 
    new Entry { EmployeeId = 1, EntryDate = '2016-11-05', InDate = '2016-11-05' }, 
    new Entry { EmployeeId = 2, EntryDate = '2016-11-01', InDate = '2016-11-01' } 
}; 

現在,我想在這樣的方式記錄應與上述名單可以匹配與EmployeeId & EntryDate作爲參數從數據庫查詢表Entry

條目表具有與上面代碼中相同的列。

如果是一個字段,我可以使用contains,但對於多個字段,我應該怎麼做?

我的數據庫表結果應該與上面的列表匹配,其中2列匹配爲EmployeeId & EntryDate

+0

你在列表中只有一個條目 - 目前還不清楚你爲什麼使用列表。如果你提供[mcve],這將有所幫助。我也強烈建議不要使用字符串來存儲日期。 –

+0

有很多條目。我舉了一個例子。列表中有超過500條記錄。 – Anup

+0

如果實際證明您需要的是一個示例,它會更有幫助 - 在這種情況下,只有兩個條目足以說清楚。 (使用具有對象初始值設定項的集合初始值設定項會使它更加清晰。)現在,您還沒有告訴我們您是如何查詢表格的。這是LINQ to SQL嗎? EF?還有別的嗎?和內存表? –

回答

2

按道理,你想要的是:

var query = db.Table.Where(e => list.Any(le => e.EmployeeId == le.EmployeeId && 
               e.EntryDate == le.EntryDate)); 

我不知道這是否會與實體框架的工作,但它是值得一試。 (例如,LINQ to Objects就可以。)

+0

如果你可以在SQL中表達它,它將與LINQ to EF一起工作。這一個不會。你可以創建一個表值參數。這是ORM過度使用的一個明確標誌。存儲過程會更好 –

+0

@PanagiotisKanavos:我建議你添加一個答案,然後我將刪除這一個。 –

+0

@JonSkeet謝謝。我會嘗試這個代碼並讓你知道。 – Anup

2

您可以通過.Contains運算符和匿名類型以與EF兼容的方式實現此目的。

您需要首先將您的列表投影到只包含要比較的屬性的匿名類型。

var projection = from e in list 
       select new { e.EmployeeId, e.EntryDate }; 

然後,您可以將它與您的查詢中的相同投影進行比較。

var query = db.Table.Where(e => projection.Contains(new { e.EmployeeId, e.EntryDate })); 

然而,這產生了每個項目的兩個參數在list SQL。這是500個記錄的性能表現,你將不得不測試。如果這不起作用,則可以使用表值參數編寫存儲過程。

+0

感謝您的回答Tim。但在另一種情況下,如果我想查詢不與表,但在列表上,那麼這將工作? – Anup

+0

你的意思是「這個查詢是否可以在內存以及SQL中使用」?好的。 –

+0

上面的代碼出現錯誤: - Delegate System.Func 不帶1個參數。 – Anup