通过id列表的亚音速加载对象

时间:2010-11-08 20:03:25

标签: subsonic load subsonic3

是否可以使用亚音速ActiveRecord通过id列表加载对象? 我的代码如下:

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

我遇到异常:不支持“包含”方法

我做错了什么......或者我遇到亚音速的限制之一?

谢谢,Radu

3 个答案:

答案 0 :(得分:1)

经过更多研究后,我找到了实现这一目标的方法:

 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>();

答案 1 :(得分:1)

仅供参考: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));

注意到差异?

听起来很奇怪,但是每当你想在Packonic中使用Contains()时,首先必须将List转换为IEnumerable以防止NotSupportedException。

答案 2 :(得分:0)

这是我认为你在寻找的单线。

var colMatchingVideos = Video.Find(objVideo =&gt; colVideoIds.Any(iVideoId =&gt; objVideo.ID == iVideoId)。ToList();

此外,我强烈建议您避免对列使用字符串文字,而是可以使用Video.Columns.Id或表达式Where(o =&gt; o.Id)。这将确保如果您在数据库中更改列名称,将发生编译时异常。在可维护性方面提供了很多帮助。