【问题标题】:Need EF/LINQ query to get all tasks assigned to a certain user需要 EF/LINQ 查询以获取分配给某个用户的所有任务
【发布时间】:2012-06-18 18:05:40
【问题描述】:

我有一个名为 TPM_TASKS 的表,其中包含所有任务,还有一个名为 TPM_USER 的表,其中包含所有用户。然后我有一个名为TPM_USERTASKS 的表,其中包含一个UserIdTaskId,其中存储了一个任务分配给一个用户。

我正在尝试选择分配给给定TPM_USER 实体的所有任务。到目前为止,我已经尝试过:

TPM_USER user = UserManager.GetUser(context, UserId); //Lookup the user in the DB
var tasks = (from t in context.TPM_TASK.Include("TPM_USER")
             where t.TPM_USER.Contains<TPM_USER>(user)
             select t);

但是,当我尝试迭代时,我得到了运行时异常:

无法创建“Entity.TPM_USER”类型的常量值。仅有的 支持原始类型(“例如 Int32、String 和 Guid”) 这个上下文。

我相信它不喜欢我将 TPM_USER 对象传递给Contains()。这可能是有道理的,因为它必须生成一个嵌套的 SELECT 语句,而不是一个 IN 子句,这可能是 EF 无法做到的。但是,肯定有办法进行这样的查询,对吧?

注意:如果你很聪明,你可能会问我为什么不直接查询TPM_USERTASKS,然后加入匹配的TPM_TASK。好吧,我会喜欢这样做。但是,我整个上午都在尝试让 EF 生成 TPM_USERTASK 模型,但它根本不会。该表显示在模型存储中,我可以针对它定义关系。它没有出现在我可以从数据库中添加或刷新的实体列表中,我什至尝试删除整个 .EDMX 文件并重新创建它。我猜在多对多关系中使用的东西不能同时是一个独立的实体?

【问题讨论】:

  • 多对多关系不会生成实体。您无法搜索整个对象,因此您必须比较构成键的原始字段。您可以发布 TPM_TASK 和 TPM_USER 类吗?我很好奇为什么不能只查询 TPM_USER 表并包含 TPM_TASK 表。

标签: c# .net linq entity-framework entity-framework-4


【解决方案1】:

您的查询将如下所示:

var tasks = (from t in context.TPM_TASK.Include("TPM_USER")
            where t.TPM_USER.Any(x => x.Id == user.Id)
            select t);

但无论如何,这有点偏离了。 TPM_USER 对象应该已经具有对 TPM_TASK 的引用。 所以 user.TPM_TASKS 应该给你给定用户的所有任务,否则你的模型在某种程度上是错误的。

TASKS 多对多用户 方法: 一项任务,许多用户。 一个用户,多个任务。

还是我错了?

更新

如果您真的想在模型中获取 TPM_USERTASKS 类,则必须为其添加单独的 Key/Id。

create table TPM_USERTASKS (
    ID      int identity(1,1)   not null
    UserId  int                 not null,
    TaskId  int                 not null,
    constraint [PK_TPM_USERTAKS] primary key (ID)
)

【讨论】:

  • 噢!不知道为什么我没有想到user.TPM_TASKS。这完美!感谢您的额外解释..
【解决方案2】:

好吧,您必须使用导航属性。

在多对多关系中,这意味着您必须有一个

public virtual ICollection&lt;TPM_USER&gt; TpmUsers {get;set;}

在你的 TPM_TASK 类中

和/或一个

public virtual ICollection&lt;TPM_TASK&gt; TpmTasks{get;set;}

在你的 TMP_USER 类中。

如果不这样做,您将无法编写连接这两个实体的查询。

这样,您可以将查询编写为

var userTasks = context.TPM_TASK
                   .Where(task => task.TpmUsers
                         .Any(user => user.Id == UserId));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多