-2

LINQ リクエストを作成できません。基本的なリクエストがあります:

        var result = from i in _dbContext.Users
                     where i.ID != CurrentUserID &&
                     //i.UserType.UserTypeID == (from a in _dbContext.UserTypes where a.UsersSelectMeetingCriteria.Any(p => p.ID == CurrentUserID) select a.UserTypeID).FirstOrDefault() &&
                     i.Services.Any(p => p.UsersSelectMeetingCriteria.Any(k => k.ID == CurrentUserID)) &&
                     i.GeographicalAreas.Any(p=>p.UsersSelectMeetingCriteria.Any(o=>o.ID == CurrentUserID)) &&
                     i.MultiplyItems.Any(r => (r.UsersSelectMeetingCriteria.Any(q => q.ID == CurrentUserID) && r.ItemType == MultiplyItemKeys.USER_TYPE)) &&
                     i.MultiplyItems.Any(s => (s.UsersSelectMeetingCriteria.Any(q => q.ID == CurrentUserID) && s.ItemType == MultiplyItemKeys.COMPANY_INVOLVED)
                     )

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

しかし、私は4レベルの検索が必要です。4 つすべてが OK の場合、これはユーザーの最初のレベルです。3 つだけの場合 (ただし 4 番目はそうではありません) - レベル #2、2 の場合 - はい、2 - いいえ、レベル #3、1 つだけ一致する場合 - レベル #4. どうやってするの?

4

1 に答える 1

1

テストされておらず、暗闇の中でかなりワイルドな刺し傷がありますが、おそらくこれはあなたを正しい方向に向けるでしょう:

var result = from i in _dbContext.Users
             let check1 = i.Services.Any(p => p.UsersSelectMeetingCriteria.Any(k => k.ID == CurrentUserID))
             let check2 = i.GeographicalAreas.Any(p=>p.UsersSelectMeetingCriteria.Any(o=>o.ID == CurrentUserID))
             let check3 = i.MultiplyItems.Any(r => (r.UsersSelectMeetingCriteria.Any(q => q.ID == CurrentUserID) && r.ItemType == MultiplyItemKeys.USER_TYPE))
             let check4 = i.MultiplyItems.Any(s => (s.UsersSelectMeetingCriteria.Any(q => q.ID == CurrentUserID) && s.ItemType == MultiplyItemKeys.COMPANY_INVOLVED))
             let level = 5 - (check1 ? 1 : 0) - (check2 ? 1 : 0) - (check3 ? 1 : 0) - (check4 ? 1 : 0)
             where i.ID != CurrentUserID && level <= 4
             select new {i, level};                 

これは、独立してチェックを実行し、成功したチェックの数を5から減算します。したがって、3つが成功し、1つが失敗した場合、5-3="レベル2"になります。

私が実際にここで正しい方向に進んでいる場合、これは巨大な混乱とさらに大きなハックのように見えることに注意してください。ロジックをストアドプロシージャに移動するか、データモデルの別の場所で単純化しようとする傾向があります。

注2、コメントされたコードも忠実に無視しました。

注3、データモデルとクエリの背後にある推論を知っていれば、これを行うためのより良い方法があると確信しています。

于 2013-02-18T16:54:45.263 に答える