Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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# LINQ对其他表的多行进行实体筛选_C#_Entity Framework - Fatal编程技术网

C# LINQ对其他表的多行进行实体筛选

C# LINQ对其他表的多行进行实体筛选,c#,entity-framework,C#,Entity Framework,我有一个CriteriaID、CriteriaValueID、UserId、companyid等列的Criteria表。另一个表是UserMaster,字段为UserID、UserName、Email。 现在在Criteria表中,对于多个条件,一个用户有多个行。这里的行数是动态的。我正在使用LINQ创建实体。我需要使用criteriavalueid搜索用户,使用和表达式搜索criteriaid E.g. companyid UserID UserName 1 1

我有一个CriteriaID、CriteriaValueID、UserId、companyid等列的Criteria表。另一个表是
UserMaster
,字段为
UserID、UserName、Email
。 现在在Criteria表中,对于多个条件,一个用户有多个行。这里的行数是动态的。我正在使用LINQ创建实体。我需要使用criteriavalueid搜索用户,使用和表达式搜索criteriaid

E.g.
companyid UserID UserName 
1          1       ABC
1          2       BCD
2          3       CDE
CriteriaID CriteriaValueID UserId companyid
1           1               1       1
2           4               1       1
3           9               1       1
1           2               2       1
2           4               2       1
当我搜索时,假设我希望用户具有
CriteriaID=2
CriteriaValueID=4
,那么LINQ to entity应该返回用户id 1,2。 实际上它可以是1的倍数。CriteriaID=2和CriteriaValueID=4.2。CriteriaID=3,CriteriaValueID=5。这里我列出了我们需要用户的标准


提前谢谢。

你试过什么吗

from c in Criteria
where c.CriteriaID = 2 && c.CriteriaValueID = 4
select c.User

这假设您在实体框架中创建的数据库和导航属性上定义了外键。

这假设您有您的
标准
对象和
公司用户
对象,可能命名为其他对象

在本例中,我手动添加
标准
,但我假设您将有一些东西添加您想要的
标准
,然后类似于
用户
。如果只比较
UserID
CompanyID
,除了将
CriteriaID
用作唯一标识符或主键之外,
CriteriaID
CriteriaValueID
似乎是多余的

// Create a list of Criteria
List<Criteria> ListOfCriteria = new List<Criteria>();
// Add Criteria where Criteria ID = 2 and CriteriaValueID = 4 and Criteria ID = 2 
// Adding Criteria objects instead of retrieval for example, you want to retrieve the Criteria object from your existing list
ListOfCriteria.Add(new Criteria() { CriteriaID = 2, CriteriaValueID = 4, CompanyID = 1, UserID = 1 });
ListOfCriteria.Add(new Criteria() { CriteriaID = 1, CriteriaValueID = 1, CompanyID = 1, UserID = 1 });
// Create a list of your users
List<CompanyUser> ListOfUsers = new List<CompanyUser>();
// The below is to add users as shown in your example, ideally, you will be pulling your User object from database
ListOfUsers.Add(new CompanyUser() { CompanyID = 1, UserID = 1, UserName = "ABC" });
ListOfUsers.Add(new CompanyUser() { CompanyID = 1, UserID = 2, UserName = "BCD" });
ListOfUsers.Add(new CompanyUser() { CompanyID = 2, UserID = 3, UserName = "CDE" });
// Retrieve a single user that matches all your requirements
CompanyUser RetrievedUser = ListOfUsers.Where(a => ListOfCriteria.All(b => b.UserID == a.UserID && b.CompanyID == a.CompanyID)).FirstOrDefault();

if(RetrievedUser == null)
    MessageBox.Show("No user found");
else
    MessageBox.Show(RetrievedUser.UserName);
//创建条件列表
List ListOfCriteria=新列表();
//添加条件,其中条件ID=2,条件ValueID=4,条件ID=2
//添加Criteria对象而不是检索例如,您希望从现有列表中检索Criteria对象
添加(新标准(){CriteriaID=2,CriteriaValueID=4,CompanyID=1,UserID=1});
添加(新标准(){CriteriaID=1,CriteriaValueID=1,CompanyID=1,UserID=1});
//创建用户列表
List ListOfUsers=新列表();
//下面是添加用户,如示例所示,理想情况下,您将从数据库中提取用户对象
添加(新的CompanyUser(){CompanyID=1,UserID=1,UserName=“ABC”});
Add(new CompanyUser(){CompanyID=1,UserID=2,UserName=“BCD”});
添加(新的CompanyUser(){CompanyID=2,UserID=3,UserName=“CDE”});
//检索符合您所有需求的单个用户
CompanyUser RetrievedUser=ListOfUsers.Where(a=>ListOfCriteria.All(b=>b.UserID==a.UserID&&b.CompanyID==a.CompanyID)).FirstOrDefault();
if(RetrievedUser==null)
MessageBox.Show(“未找到用户”);
其他的
MessageBox.Show(RetrievedUser.UserName);

在上述情况下,我只提到了一个条件,但实际上它可以是多个,比如1。CriteriaID=2和CriteriaValueID=4.2。CriteriaID=3,CriteriaValueID=5。这里我列出了我们需要用户的标准。在这种情况下,我不知道在
EF
中是否可以。要做到这一点,您可能需要回到存储过程。这里有一个针对
MySql
的有用解决方案,我认为在
sqlserver
中也可以实现类似的功能。然后将存储过程映射到
EF
非常简单