Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要EF/LINQ查询来获取分配给某个用户的所有任务_C#_.net_Linq_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 需要EF/LINQ查询来获取分配给某个用户的所有任务

C# 需要EF/LINQ查询来获取分配给某个用户的所有任务,c#,.net,linq,entity-framework,entity-framework-4,C#,.net,Linq,Entity Framework,Entity Framework 4,我有一个名为TPM\u TASKS的表,其中包含所有任务,还有一个名为TPM\u USER的表,其中包含所有用户。然后,我有一个名为TPM_USERTASKS的表,其中包含一个UserId和TaskId,用于存储一个任务对一个用户的分配 我正在尝试选择分配给给定TPM\u用户的所有任务。到目前为止,我已经尝试: TPM_USER user = UserManager.GetUser(context, UserId); //Lookup the user in the DB var tasks =

我有一个名为
TPM\u TASKS
的表,其中包含所有任务,还有一个名为
TPM\u USER
的表,其中包含所有用户。然后,我有一个名为
TPM_USERTASKS
的表,其中包含一个
UserId
TaskId
,用于存储一个任务对一个用户的分配

我正在尝试选择分配给给定
TPM\u用户的所有任务。到目前为止,我已经尝试:

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);
TPM\u USER USER=UserManager.GetUser(上下文,UserId)//在数据库中查找用户
var tasks=(来自context.TPM_TASK.Include(“TPM_用户”)中的t)
其中t.TPM_USER.Contains(用户)
选择t);
但是,当我尝试迭代到该文件时,会出现运行时异常:

无法创建“Entity.TPM\u USER”类型的常量值。只有 中支持基元类型(“如Int32、字符串和Guid”) 这个背景

我相信它不喜欢我将TPM_用户对象传递到
Contains()
。这可能是有意义的,因为它必须在
子句中生成一个嵌套的SELECT语句,而不是一个
,这可能是EF无法做到的。然而,肯定有一种方法可以进行这样的查询,对吗


注意:如果你很聪明,你可能会问我为什么不直接查询
TPM\u用户任务
,然后加入匹配的
TPM\u任务
。嗯,我很乐意这样做。然而,我整个上午都在试图让EF生成一个TPM_用户任务模型,但它根本不会。该表显示在模型存储中,我可以根据它定义关系。它不会出现在我可以添加或从数据库刷新的实体列表中,我甚至尝试删除整个.EDMX文件并再次创建它。我猜在多对多关系中使用的某些东西不可能是独立实体?

您的查询如下所示:

var tasks = (from t in context.TPM_TASK.Include("TPM_USER")
            where t.TPM_USER.Any(x => x.Id == user.Id)
            select t);
但无论如何这有点不对劲。TPM_用户对象应该已经有对TPM_任务的引用。 因此user.TPM_任务应该为您提供给定用户的所有任务,否则您的模型可能会出错

任务多对多用户 指: 一个任务,多个用户。 一个用户,多个任务

还是我错了

更新

如果您真的想在模型中获得TPM_USERTASKS类,则必须向其添加单独的键/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)
)

您的查询如下所示:

var tasks = (from t in context.TPM_TASK.Include("TPM_USER")
            where t.TPM_USER.Any(x => x.Id == user.Id)
            select t);
但无论如何这有点不对劲。TPM_用户对象应该已经有对TPM_任务的引用。 因此user.TPM_任务应该为您提供给定用户的所有任务,否则您的模型可能会出错

任务多对多用户 指: 一个任务,多个用户。 一个用户,多个任务

还是我错了

更新

如果您真的想在模型中获得TPM_USERTASKS类,则必须向其添加单独的键/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)
)

嗯,你必须使用导航属性

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

公共虚拟ICollection TpmUsers{get;set;}

在TPM_任务类中

和/或

公共虚拟ICollection任务{get;set;}

在您的TMP_用户类中

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

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

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

嗯,你必须使用导航属性

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

公共虚拟ICollection TpmUsers{get;set;}

在TPM_任务类中

和/或

公共虚拟ICollection任务{get;set;}

在您的TMP_用户类中

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

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

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

多对多关系不会生成实体。不能按整个对象进行搜索,因此必须比较组成键的基本字段。您可以发布TPM_任务和TPM_用户类吗?我很好奇为什么不能只查询TPM_用户表,而包括TPM_任务表。多对多关系不会生成实体。不能按整个对象进行搜索,因此必须比较组成键的基本字段。您可以发布TPM_任务和TPM_用户类吗?我很好奇,为什么不能只查询TPM_用户表,而包括TPM_任务表。Doh!不确定为什么我没有想到
user.TPM\u任务。那太好了!不过,谢谢你的额外解释……啊!不确定为什么我没有想到
user.TPM\u任务。那太好了!不过谢谢你的额外解释。。