构造linq查询

时间:2012-12-17 11:06:34

标签: c# linq entity-framework-5

我正在努力找出一个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; } 
}

3 个答案:

答案 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的用户。

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