2

我正在努力找出一个我认为是非常常见的情况的 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; } 
}
4

3 回答 3

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 Diaries 列表等。然后您可以对小部件重复此操作(此外,这只是在此处的窗口中编码出来的,因此可能存在拼写错误)

编辑:你也可以使用

         new Dictionary<User, List<DigitalDiary>>(); 

如果您一完成就想要完整的用户字段。我只是习惯存放钥匙

于 2012-12-17T11:14:48.053 回答
0

如果我理解了这个问题并且您正在使用 EntityFramework

您可能需要使用 Select Projection 来满足您的要求。这个例子是一个 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
于 2012-12-17T11:23:40.587 回答
0

如果我理解正确,假设你有一个nameList集合,你可以遍历这个列表,只获取你正在寻找的值。然后,如果找到您要查找的值,您可以将具有这些值的负责人添加到.UsermyUserListUserListUser

例子

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被管理员禁用且一个Widget被管理员禁用的用户。

谢谢,
我希望你觉得这有帮助:)

于 2012-12-17T11:40:37.833 回答