【问题标题】:Using Contains in ObjectQuery在 ObjectQuery 中使用包含
【发布时间】:2011-05-10 21:52:35
【问题描述】:

这是我的情况:

我在艺术家和活动之间建立了 m:n 关系。我想要做的是获得一个 IQueryable 只包含包含某个艺术家的事件。我正在为我的数据访问层使用存储库。显然以下方法不起作用:

_db.EventSet.Include("Location").Where(e => (e.Artists.Contains(artist)) && (e.StartDate > System.DateTime.Now)).OrderBy(e => e.StartDate);

由于我是 Entity Framework 的新手,我不太明白为什么,但我可以猜到。因此,如果有人能以非常简单的方式解释这一点,我也将不胜感激。无论如何,我想出的解决方案如下:

IQueryable<Event> events = _db.EventSet.Include("Location").Where(e => (e.EndDate > System.DateTime.Now));
List<Event> eventsList = new List<Event>();
foreach (var ev in events)
{
    eventsList.Add(ev);
}
return (IQueryable<Event>)eventsList.AsQueryable().Where(e => e.Artists.Contains(artist)).OrderBy(e=>e.StartDate);

这根本不是一个好的解决方案,因为所有事件都被检索和处理,这是一个巨大的开销。有没有人可以告诉我一个更好的解决方案来解决我的问题?我也知道我并不真正了解 ObjectQuery 是什么以及如何将其转换为 IQueryable(如果可能的话)。

我很感激任何建议。

【问题讨论】:

    标签: c# entity-framework objectquery sql


    【解决方案1】:

    您可以将 Any 与艺术家 ID 字段一起使用,这里假设名称为 ArtistId

    _db.EventSet.Include("Location")
                .Where(e => (e.Artists.Any(a => a.ArtistId == artist.ArtistId)) && (e.StartDate > System.DateTime.Now))
                .OrderBy(e => e.StartDate);
    

    【讨论】:

    • @Saeed,你为什么不认为它有效?诚然,我不知道 OP 数据库的确切架构,但我设置了一个包含事件、艺术家和位置的数据库,并对其进行了测试,并且成功了。
    • 我认为,(e.Artists.Any(a =&gt; a.ArtistId == artist.ArtistId) 无法处理,因为您没有获取的数据来搜索它,只是猜测,它是 EF,如果它是 AsEnumerable() 没有区别像我说的那样执行它应该可以工作,但在这种情况下我认为它不能进行 sql 查询。
    • 在这种情况下 Any 和 contains 有什么区别?
    • @Saeed,Contains 将抛出异常,Only primitive types ('such as Int32, String, and Guid') are supported in this context.。我相信这是因为 EF 无法将 artist 对象转换为 sql。因此,改为使用Any 并将ArtistId 提供给EF(对我来说,我使用了guid)。
    • 你使用了e.Artists,我认为它不起作用,但如果它起作用了,那就太棒了
    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 2012-01-14
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2013-05-02
    • 2012-11-22
    • 2017-08-25
    相关资源
    最近更新 更多