4

a.idに存在するアイテムを除外しようとしていますdb.AdminAdjusterStatus

from u in db.Users
join a in db.Adjusters on u.id equals a.userID
where u.userType.ToLower() == "adjuster"
   && !(from x in db.AdminAdjusterStatus select x.adjusterID).Contains(a.id)
select new AdjusterProfileStatusItem { user = u, adjuster = a }

上記のコードは、「 where NOT contains a.idin db.AdminAdjusterStatus.adjusterID.

問題は、それが機能しないことです。に次の 2 つのエントリがありますdb.AdminAdjusterStatus

A9EC05B5-651D-4AA7-8275-1F6BFE212C03
1BDE55D9-ED0A-4854-9D5F-B89DB17F02D2

そして、LINQ クエリは私に与えます:

A9EC05B5-651D-4AA7-8275-1F6BFE212C03
1BDE55D9-ED0A-4854-9D5F-B89DB17F02D2
e21ff49c-9505-495d-b4a3-c259ee3459d6

一方、それは私にのみ与えるはずです:

e21ff49c-9505-495d-b4a3-c259ee3459d6
4

4 に答える 4

1

助けてくれたみんなに感謝し、誰かの時間を無駄にして申し訳ありません。この行に気付きました:

obj.adjusterID = '@(Url.RequestContext.RouteData.Values["id"])';

私のコードの他の場所は、私が思っていたu.idのではなく、送信していました。a.idこのため、間違った ID をデータベースに保存していたため、問題が発生していました。

あなたのご親切に感謝します!

于 2013-07-18T13:36:55.993 に答える
1

Left Join を実行して、null レコードをフィルタリングしてみてください。テストするデータがなければ、「すぐに」機能するかどうかはわかりませんが、このようなフィルタリングを行うために次のコードを数回使用しました。

db.Users.Join(db.Abjusters, outer => outer.id, inner => inner.userID, new { User = outer, Adjuster = inner })
    .GroupJoin(DBConcurrencyException.AdminAdjusterStatus, outer => outer.Adjuster.id, inner => inner.adjusterID, new { User = outer.User, Adjuster = outer.Adjuster, Admins = inner })
    .SelectMany(grp => grp.Admins.DefaultIfEmpty(), (grp, admin) => new { User = grp.User, Adjuster = grp.Adjuster, Admin = admin })
    .Where(item => item.User.userType == "adjuster" && item.Admin == null)
    .Select(item => new AdjusterProfileStatusItem { user = item.User, adjuster = item.Adjuster });

GroupJoin/SelectMany の組み合わせは Left Join を実行し、オブジェクトが null である場所をフィルタリングして、NOT IN と同じ結果を生成することができます。

于 2013-07-18T13:28:45.647 に答える
1

おそらくこれはうまくいくでしょうか?

            var AdjusterItems = from aa in AdminAdjusterStatus
                            join a in Adjusters
                            on aa.AdjusterId equals a.AdjusterId
                            select a.UserId;

        var UsersNotAdjustAdmin = from u in Users
                                  where !AdjusterItems.Any(x => x == u.Id)
                                  && u.UserType.Equals("Adjuster", StringComparison.InvariantCultureIgnoreCase)
                                  select u;

        var result = from u in UsersNotAdjustAdmin
                     join a in Adjusters
                     on u.Id equals a.UserId
                     select new AdjusterProfileStatusItem() { Adjuster = a, User = u };
于 2013-07-18T13:39:27.437 に答える
1
var query = from u in db.Users
             from a in db.Adjusters                         
             where u.userType.ToLower() == "adjuster" && 
             u.id == a.userID && 
             !db.AdminAdjusterStatus.Any(i => i.adjusterID == a.id)

...

于 2013-07-18T12:56:32.643 に答える