C# LINQ对其他表的多行进行实体筛选
我有一个CriteriaID、CriteriaValueID、UserId、companyid等列的Criteria表。另一个表是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
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
非常简单