我正在努力找出一个linq声明,我认为这是一种非常常见的情况。假设下面的结构,我有很多用户,每个用户都有很多日记,每个日记都有很多小部件。
我想说,让我看看UserName ='bob'和Password ='password'的用户以及DisabledByAdmin == true的用户日记和DisabledByAdmin == true的列表小部件只有前一个语句返回的日记。
假设数据是1个链接到2个日记的用户(一个具有DisabledByAdmin == true),并且这2个日记每个都有2个小部件(1个具有DisabledByAdmin == true),我想让我的用户对象返回我的列表中有1个日记对象,每个日记中有1个小部件。
因此返回数据将是用户对象,在该日记集合中有一个日记和一个小部件。对于我的生活,我无法理解这一点。
任何?
非常感谢 拉尔夫
public class Widget
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Name { get; set; }
public bool DisabledByAdmin { get; set; }
public bool DisabledByUser { get; set; }
}
public class DigtalDiary
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public bool DisabledByAdmin { get; set; }
public bool DisabledByUser { get; set; }
public virtual List<Widget> Widgets { get; set; }
}
public class User
{
[Key]
public int Id { get; set; }
public string Password { get; set; }
public string UserName { get; set; }
public virtual List<DigtalDiary> Diaries { get; set; }
}
答案 0 :(得分:2)
像
这样的东西 var users from u in UserList
where u.UserName = "Bob" and u.Password = "123";
var lookup = new Dictionary<int, List<DigitalDiary>>();
foreach(var u in users)
{
var digitalDiaries = from dd in u.Diaries
where dd.DisabledByAdmin != true; //Or whatever your criteria
lookup.add(u.Id, digitalDiaries.toList());
}
这将为您提供符合您标准的UserId字典,以及未禁用该用户的Ditital日记列表等等。 然后你可以为Widgets重复一遍 (这也只是在这里的窗口中编码,所以可能有拼写错误)
编辑: 你也可以使用
new Dictionary<User, List<DigitalDiary>>();
如果您在完成后想要完整的用户字段。我只是习惯存储密钥
答案 1 :(得分:0)
如果我理解了问题您正在使用EntityFramework
您可能需要使用选择投影来满足您的要求。 这个例子是AND,使用||适当的或适用的条件
var mylist = Context.Set<User>.Where(u=>u.Id==userId && u.Password==password
&& u.Diaries.DiabledByAdmin == false
&& u.Diaries.Widgets.DisabledByAdmin == false)
.Select(new {u.Id, u.Diaries.Id,u.Diaries.Widgets.Id}); //remove select if user Object desired
答案 2 :(得分:0)
如果我理解正确,假设您有一个名为List
的{{1}} User
集合,您可以遍历此列表,只获取您要查找的值。然后,如果找到了您要查找的值,则可以将负责这些值的myUserList
添加到User
的新List
集合中。
示例强>
User
通知:这只会让管理员禁用至少一个List<User> myUserList = new List<User>(); //Initialize a new List of Users
//Add users to the list
myUserList.Add(new User() { UserName = "bob", Password = "password" });
myUserList.Add(new User() { UserName = "Joe", Password = "password" });
myUserList.Add(new User() { UserName = "Miranda", Password = "password" });
myUserList.Add(new User() { UserName = "Kevin", Password = "password" });
//
List<User> myGatheredList = new List<User>(); //Initialize a new List of Users of name myGatheredList (not required)
foreach (User _user in myUserList.Where(x => x.UserName == "bob" && x.Password == "password")) //Only get values which match a UserName of value 'bob' and a password of value 'password' as _user for every User
{
Debug.WriteLine(_user.UserName); //Writes 'bob'.
foreach (DigtalDiary _diary in _user.Diaries) //Get every DigitalDiary in _user.Diaries as _diary for every DigitalDiary
{
if (_diary.DisabledByAdmin /*&& _diary.Widgets.Count == x */ /* More conditions can be inserted here */) //Continue if _diary.DisabledByAdmin is true
{
foreach (Widget _widget in _diary.Widgets) //Get every Widget in _diary.Widgets as _widget for every Widget
{
if (_widget.DisabledByAdmin) //Continue if _widget.DisabledByAdmin is true
{
if (!myGatheredList.Contains(_user)) //Continue if _user does not exist in myGatheredList
{
myGatheredList.Add(_user); //Add _user to myGatheredList (not required)
//Do something with _user
}
}
}
}
}
}
且管理员禁用一个DigitalDiary
的用户。
谢谢, 我希望你觉得这很有帮助:)