LINQ to SQL не имеет способа представления поиска в памяти Dictionary
как SQL.Один из способов - использовать AsEnumerable
, чтобы убедиться, что вместо этого вы используете LINQ to Objects:
var data = from document in context.documents.AsEnumerable()
where dictionary.Contains(new KeyValuePair(document.DocNum, document.Area))
select new
{
...whatever
}
Обратите внимание, что это фактически означает, что вы выбираете каждую строку из context.documents
.Если это небольшая таблица, это не должно быть проблемой, но для большой таблицы вы должны рассмотреть возможность такого рода фильтрации на стороне сервера, непосредственно в SQL - например, путем замены клиентской стороны Dictionary
на стороне сервера.стол (который вы можете присоединить с помощью documents
), возможно, даже временный стол (в зависимости от ваших потребностей).
--- EDIT ---
Если , то Dictionary
мала, а таблица большая, но хорошо проиндексирована, возможно, стоит выполнить отдельный запрос для каждого искомого значения.Например:
class Program {
static void Main(string[] args) {
var criteria = new Dictionary<KeyValuePair<string, string>, object> {
{ new KeyValuePair<string, string>("n1", "a1"), null },
{ new KeyValuePair<string, string>("n2", "a2"), null },
{ new KeyValuePair<string, string>("n3", "a3"), null },
};
using (var ctx = new DataClasses1DataContext()) {
ctx.Log = Console.Out;
var rows = new List<Document>();
foreach (var criterion in criteria.Keys) {
var q = from document in ctx.Documents
where document.DocNum == criterion.Key && document.Area == criterion.Value
select document;
rows.AddRange(q);
}
foreach (var row in rows)
Console.WriteLine("{0}, {1}", row.DocNum, row.Area);
}
}
}
Это печатает следующий вывод:
SELECT [t0].[DocNum], [t0].[Area]
FROM [dbo].[Document] AS [t0]
WHERE ([t0].[DocNum] = @p0) AND ([t0].[Area] = @p1)
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [n1]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [a1]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
SELECT [t0].[DocNum], [t0].[Area]
FROM [dbo].[Document] AS [t0]
WHERE ([t0].[DocNum] = @p0) AND ([t0].[Area] = @p1)
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [n2]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [a2]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
SELECT [t0].[DocNum], [t0].[Area]
FROM [dbo].[Document] AS [t0]
WHERE ([t0].[DocNum] = @p0) AND ([t0].[Area] = @p1)
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [n3]
-- @p1: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [a3]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
n1, a1
n2, a2
n3, a3
Обратите внимание, однако, что это тратит впустую Dictionary
врожденные возможности поиска (это также может быть любой другой IEnumerable
) и работает очень плохо, если в словаре много элементов.