【问题标题】:How to express LINQ to Entities query without 'Only primitive types' error如何在没有“仅原始类型”错误的情况下表达 LINQ to Entities 查询
【发布时间】:2013-02-08 23:59:45
【问题描述】:

我有一个 Game 模型,它附加了许多 Organizer 模型。这是我的模型:

public class Organizer
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<Game> Games {get; set; }
}

public class Game
{
    public int ID { get; set; }
    public string Name { get; set;}
    public List<Organizer> Organizers { get; set; }
}

我正在尝试获取包含特定组织者的所有游戏。例如,我可能有一些这样的数据:

Game
ID    Name
--    ----
1     Soccer
2     Baseball

Organizer
ID    Name
--    ----
1     John
2     Barry

GameOrganizer
GameID    OrganizerID
------    -----------
1         1
2         1

这是我尝试使用的代码:

Organizer thisOrganizer = db.Organizers.Single(o => o.ID == 1);

var gamesQuery = db.Games
    .Where(game => game.Organizers.Contains(thisOrganizer))
    .Select(g => new { ID = g.ID, Name = g.Name });

这给了我一个错误:

在此上下文中仅支持原始类型。

我明白这意味着什么,但我不知道如何以不同的方式表达它。我最接近的是:

var gamesQuery = db.Games
    .Where(game => game.Organizers
        .Any(gO => gO.ID == 1));

但这只是什么都不返回。我到处看了看,但一切都处理事先已经知道的字符串数组。

那么,如果没有模型对象,我该如何表达呢?

【问题讨论】:

  • 您的 Organizer 类中没有 Games 属性吗?这是代码优先吗?你能发布这两个课程吗?
  • @Jobo Organizer 上有一个 Games 属性。这是代码优先。我会补课的。
  • 那么我认为 abatishchev 的答案应该是正确的方法。

标签: c# entity-framework exception-handling linq-to-entities


【解决方案1】:

在您的 Organizer 类中,您的 Games 属性应如下所示:

public virtual ICollection<Game> Games { get; set; }

here为什么。

那么您应该能够像 abatishchev 在他的回答中所写的那样访问所有游戏:

Organizer thisOrganizer = db.Organizers.Single(o => o.ID == 1);
var games = thisOrganizer.Games;

【讨论】:

    【解决方案2】:

    您还需要将 Games 声明为 Organizer 的(导航)属性,那么它将是:

    db.Organizers.Single(o => o.ID == 1).Games;
    

    【讨论】:

    • 哦,天哪,我不知道为什么我没想过那样做。这是有道理的。修改后就可以了!谢谢。
    猜你喜欢
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2020-03-19
    相关资源
    最近更新 更多