Звуковая загрузка объектов по списку идентификаторов - PullRequest
1 голос
/ 08 ноября 2010

Можно ли загружать объекты по списку идентификаторов с помощью дозвукового ActiveRecord?Мой код выглядит так:

IList<Video> videos = Video.Find(v => videoIds.Contains(v.ID));

Я получаю исключение: метод «Содержит» не поддерживается

Я что-то не так делаю ... или я столкнулся с одним из ограничений дозвукового?

Спасибо, Раду

Ответы [ 3 ]

1 голос
/ 24 декабря 2010

К вашему сведению: синтаксический анализатор SubSonic linq не любит общие списки и содержит

// does not work
List<int> videoIds = new List<int>() {1,2,3,4,5};
var videos = Video.Find(v => videoIds.Contains(v.ID));

// should work
IEnumerable<int> videoIds = new List<int>() {1,2,3,4,5};
var videos = Video.Find(v => videoIds.Contains(v.ID));

Заметили разницу?

Звучит странно, но всякий раз, когда вы хотите использовать Contains () с Subsonic, вы сначала должны привести свой List к IEnumerable, чтобы предотвратить исключение NotSupportedException.

1 голос
/ 09 ноября 2010

После дополнительных исследований я нашел способ добиться этого:

 List<int> videoIds = new List<int>(){1, 2, 3, 4, 5};
 SqlQuery query = new Select().From<Video>().Where("ID").In(videoIds);
 List<Video> videos = query.ExecuteTypedList<Video>();
0 голосов
/ 21 декабря 2010

Это единственная строка, которую, как вам кажется, вы ищете.

var colMatchingVideos = Video.Find (objVideo => colVideoIds.Any (iVideoId => objVideo.ID == iVideoId) .ToList ();

Также я настоятельно рекомендую вам не использовать строковые литералы для столбцов, вместо этого вы можете использовать Video.Columns.Id или выражения Where (o => o.Id). Это обеспечит, если вы измените свой столбецИмена в базе данных возникнет исключение времени компиляции. Помощь много с ремонтопригодностью.

...