Как выбрать из родительского на основе дочернего свойства в EntityFramework и ESQL - PullRequest
1 голос
/ 28 февраля 2011

У меня есть родительская / дочерняя таблица в Entity Framework, и мне нужно выбрать строку из родительского на основе дочернего первичного ключа.

Я пишу эти коды:

List<int> s = (from all in DB.TbProfiles
                    where all.TbMaharat.Any(c => maharat.Contains(c.MaharatId))
                    select all.ProfileId).ToList();

но я обнаружил, что Linq2Entity не поддерживает «Contains», и я должен использовать «MultiSet» и команду ESQL. но я могу найти любой образец для этого.

Я пишу ESQL вот так, но он не работает:

byte[] moshTypes = new byte[] { 1, 2, 3 };

        List<int> s =  DB.TbProfiles.Where("it.TbMaharat exists(Select 0 from TbMaharat as e where e.MaharatId IN MultiSet (" + string.Join(",", moshTypes) + "))")
            .Select(c=>c.ProfileId).ToList();

        return s;

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 14 ноября 2011

Чтобы использовать метод IEnumerable<T>.Contains(), вам нужно загрузить таблицу в память, используя ToList() или ToArray(). Однако это может привести к большой стоимости памяти, поэтому просто не делайте этого, если таблица не очень мала и не будет расти со временем. Для метода Contains существует обходное решение: создайте выражение OR для каждого значения, чтобы метод Contains() стал DB.TbMaharat.Where(x=>x.MaharatId == 1 || x.MaharatId == 2 || x.MaharatId == 3). Посмотрите ветку MSDN о том, как это сделать: http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/095745fe-dcf0-4142-b684-b7e4a1ab59f0/.

...