2

次のテーブルがあります

Users
 - ID
 - FirstName
 - LastName

MultiplyItems
 - ItemID
 - Title

UserMultiplyItems
 - UserID
 - ItemID

私は変数を持っています

List<int> delegateList = {1, 3, 5};

1、3、5 は ItemID です

少なくとも 1 つの ItemID が選択可能なユーザーにリンクされているすべてのユーザーを選択したい。私は次のことを試します:

        var result = from i in _dbContext.Users
                     where 
                     ((delegateList == null) || i.MultiplyItems.Any(p=> delegateList.Any(a => a == p.ItemID)))

                     select new UserModel()
                     {
                         ....
                     };

しかし、それは機能しません。エラー:

タイプ 'System.Collections.Generic.List`1' の要素を比較できません。プリミティブ型、列挙型、およびエンティティ型のみがサポートされています。

正しく行う方法は?ありがとう

4

5 に答える 5

2

私はこれを書きます:

var filteredUsers = delegateList == null 
    ? _dbContext.Users
    : _dbContext.Users.Where(user => user.MultiplyItems
        .Any(item => delegateList.Contains(item.Id)));

var result = filteredUsers.Select(user => new UserModel
        {
            //the UserModel initialization
        });

クエリ内の次の行はチェックしないでください。

delegateList == null

これは SQL に変換されますが、SQL は List とは何か、それを null と比較する方法についてはわかりません。

于 2013-02-08T00:35:05.157 に答える
0
    var result = from i in _dbContext.Users
    from mi in i.multiplyItems
    select new yourClass();

    if(delegateList!=null)
    {
       result = result.Where(delegateList.contains(mi.ItemID));
    }

    result.ToList();

Visual Studioを開いてテストすることはありませんが、そのようになっているはずです。

于 2013-02-08T00:10:00.487 に答える
0

これがあなたが望んでいたものかどうかは正確にはわかりませんが、試して助けたほうがよいと思いました.

これにより、ItemID が delegateList に含まれているユーザー テーブルからすべてのユーザーが出力されます。リストbに含まれるリストaから要素を取得できるContains演算子に魔法があります

var selection = from a in db.UserMultiplyItems
                from b in db.Users
                where delegateList.Contains(a.ItemID) && a.UserID == b.ID
                select b;
于 2013-02-08T00:41:26.143 に答える
-1

次のように変更してみてください。

var result = from u in _dbContext.Users
where 
((delegateList == null) || u.MultiplyItems.Any( mi => delegateList.Contains(mi.ItemID)))

select new UserModel()
{
 ....
};

また、読みやすくするために、「i」と「p」の名前を「u」と「mi」に変更したことに注意してください。

于 2013-02-08T00:17:58.993 に答える
-1

あるいは、LINQ をまったく使用せず、ラムダ式に固執することもできません。

List<UserModel> usersWithItems =
    context
    .Users
    .Where(u => u.MultiplyItems.Any(mi => (delegateList == null) || (delegateList.Contains(mi.ItemID))))
    .Select(um => (new UserModel() { ...  } ) )
    .ToList();

私が個人的に好むのは、linq をまったく知る必要がないということです。

于 2013-02-08T00:30:03.043 に答える