Всем привет! Есть List<int> id = new List<int>(); со значениями,
{12, 13, 14, 15}
В БД есть поля HomeId и GuestId.
Нужно найти все записи совпадающие по парно с id из листа, т.е. HomeId=12 и GuestId=15,
На сколько я понимаю необходимо сделать запрос к БД через where. Примерно так db.Test.Where(i=>i.HomeId == id[0] && i.GuestId == id[1])...
Возникает вопрос как быть если размер List не известен?
Для самого запроса с ходу не вспомню. Any(...) емнип работать не будет, .Join() тоже. Можно перебирать лениво (тоже не сахар), или сгенерить ef sql и выполнять уже его.
Проще всего, наверное, через PredicateBuilder.
Что-то вроде такого:
var idList = new List<int>();
var predicate = PredicateBuilder.False<YourEntity>();
for (var i = 0; i < idList.Count; i += 2)
{
int captured = i;
predicate = predicate.Or(x => x.HomeId == idList[captured] && x.GuestId == idList[captured + 1]);
}
var matches = db.YourEntities.AsQueryable().Where(predicate).ToArray();
Здравствуйте, ronik, Вы писали:
R>Всем привет! Есть List<int> id = new List<int>(); со значениями, R>{12, 13, 14, 15}
Не скажу за EF, а на linq2db можно так:
using (var db = new DataConnection())
{
var arr = new[] { 11, 12, 13, 14 };
var list =
from i in Enumerable.Range(0, arr.Length / 2)
select new { HomeId = arr[i * 2], GuestId = arr[i * 2 + 1] };
var q =
from t in db.GetTable<Table1>()
where list.Contains(new { t.HomeId, t.GuestId })
select t;
q.ToList();
}
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, TK, Вы писали:
TK>Здравствуйте, ronik, Вы писали:
R>>Возникает вопрос как быть если размер List не известен?
TK>Размер List всегда есть в List.Count
Не, ну это понятно... Вы уж совсем меня за новичка держите...
Здравствуйте, Sinix, Вы писали:
S>Для самого запроса с ходу не вспомню. Any(...) емнип работать не будет, .Join() тоже. Можно перебирать лениво (тоже не сахар), или сгенерить ef sql и выполнять уже его.
Join(), кстати, тоже работает (EF 6.1.3):
var pairs = from i in Enumerable.Range(0, id.Count / 2) select id[i * 2] + "_" + id[i * 2 + 1];
var query = db.Test.Join(pairs, te => te.HomeId.ToString() + "_" + te.GuestId.ToString(), i => i, (te, _) => te);
SELECT
[Extent1].[HomeId] AS [HomeId],
[Extent1].[GuestId] AS [GuestId]
FROM [dbo].[TestObjects] AS [Extent1]
INNER JOIN (SELECT
N'12_13' AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT
N'14_15' AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1]
ON
( CAST( [Extent1].[HomeId] AS nvarchar(max)) + N'_' + CAST( [Extent1].[GuestId] AS nvarchar(max))) = [UnionAll1].[C1]
Здравствуйте, scale_tone, Вы писали:
_>Join(), кстати, тоже работает (EF 6.1.3):
Угу, жить захочешь — и не так раскорячишься
Как я понял, топикстартеру всё-таки нужно решение для продакшна, а не армейским способом (в хорошем смысле).
Кстати, ещё вариант: Contains() по столбцу с большей селективностью и затем дофильтровать на клиенте.