【问题标题】:LINQ Intersect Query for Many to Many relationship using .NET4 MVC4 Code First使用 .NET4 MVC4 代码优先的多对多关系的 LINQ 相交查询
【发布时间】:2013-04-02 01:17:48
【问题描述】:

在使用 Code First 的 .NET4 MVC 4 中,我有两个类形成多对多关系。 如何编写一个简单的 LINQ 查询来从给定的流派列表中查找至少具有一种或多种流派的所有游戏? (即检索所有策略和/或沙盒类型的游戏)

public class Game
{
    public int ID { get; set; }
    public virtual ICollection<Genre> Genres { get; set; }
}

public class Genre
{
    public int ID { get; set; }
    public virtual ICollection<Game> Games { get; set; }
}

请注意,我使用的是 Code First,因此我无法访问抽象连接表 GenreGames。

我已尝试以下方法从数组 gid 中找到包含至少一个流派 ID 的游戏:

var gid = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var result = from g in unitOfWork.GameRepository.dbSet
             where (
                 from gen in unitOfWork.GenreRepository.dbSet
                 where gid.Contains(gen.ID)
                 select gen.ID
             ).Any()
             select g;

检索结果时

List<Game> similiarGames = result.ToList<Game>();

出现以下错误。

无法创建“GratifyGaming.Domain.Models.Genre”类型的常量值。此上下文仅支持原始类型或枚举类型。

如何仅使用原始类型或枚举类型获得我想要的结果?有解决办法吗?

【问题讨论】:

    标签: c# asp.net-mvc linq asp.net-mvc-4 many-to-many


    【解决方案1】:

    试试这个:

    var test = unitOfWork.GameRepository.dbSet
                             .Where(G => G.Genres.Where(genre => 
                                         gid.Contains(genre .ID)).Count() > 0);
    

    祝你好运!!

    【讨论】:

    • 您提供的答案与游戏 ID 和流派 ID 相匹配。我正在尝试将任何 G.Genre ID 与 gid 中的任何值匹配。
    【解决方案2】:

    试试这个:

    var result = unitOfWork.GameRepository.dbSet
        .Where(game => game.Genres.Any(genre => gid.Contains(genre.ID));
    

    【讨论】:

    • 感谢您的建议。不幸的是,您的解决方案导致完全相同的错误“无法创建类型为 'GratifyGaming.Domain.Models.Genre' 的常量值。在此上下文中仅支持原始类型或枚举类型。”
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多