2

非常に一般的なシナリオだと思うlinqステートメントを理解するのに苦労しています。以下の構造を仮定すると、私には多くのユーザーがいて、各ユーザーには多くの日記があり、各日記には多くのウィジェットがあります。

UserName = 'bob' および Password = 'password' であるユーザーと、DisabledByAdmin == true であるユーザーの日記と、DisabledByAdmin == true であるリスト ウィジェットと、前のステートメントが返した日記のみを取得します。

データが 2 つの日記 (1 つは DisabledByAdmin == true) にリンクされている 1 人のユーザーであり、それらの 2 つの日記にはそれぞれ 2 つのウィジェット (1 つは DisabledByAdmin == true) があると仮定すると、リストに 1 つの日記オブジェクトと、各日記に 1 つのウィジェット。

したがって、返されるデータはユーザー オブジェクトであり、そのダイアリー コレクションに 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

あなたが nameのListコレクションを持っていると仮定して、私があなたを正しく理解していれば、このリストを繰り返し処理して、探している値だけを取得することができます。次に、探している値が見つかった場合は、これらの値を持つ責任者を の新しいコレクションに追加できます。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: これは、管理者によって少なくとも 1 人が無効にされ、管理者によって1 人が無効にされたユーザーのみを取得しますWidget

ありがとう、
これがお役に立てば幸いです:)

于 2012-12-17T11:40:37.833 に答える
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 に答える