2013-07-18 446 views
4

我想排除存在於db.AdminAdjusterStatus中的a.id的項目。LINQ「not in」not working

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 } 

上面的代碼說,「哪裏都不包含在db.AdminAdjusterStatus.adjusterIDa.id

的問題是,它不工作,我有這兩個項目在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 

Whe REAS,它應該只給我:

 
e21ff49c-9505-495d-b4a3-c259ee3459d6 
+0

如果您打算合理縮進,您的查詢將會很容易閱讀。 –

+0

@JonSkeet對不起,我不知道如何縮進它,但我願意接受建議。 – user1477388

+2

現在編輯它。我個人只是使​​用'!db.AdminAdjusterStatus.Select(x => x.adjusterID).Contains(a.id)'我自己,而不是使用嵌入式查詢表達式。 –

回答

1

感謝大家的幫助和遺憾,浪費任何人的時間。我意識到,這條線:

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

其他地方在我的代碼已經被髮送u.id而不是a.id因爲我曾認爲這是。因此,我在數據庫中保存了錯誤的ID,從而導致我遇到的問題。

再次感謝您的幫助!

+0

這隻表明其他答案使用了錯誤的方法:他們移動了一些代碼,希望能夠使其工作。沒有人看到或理解任何錯誤。 – usr

+0

@usr根據提供的信息,未檢測到任何錯誤。顯然,我自己並不知道。我們可以關閉它,因爲它是如此本地化。謝謝。 – user1477388

+1

如果您沒有看到任何錯誤,請勿隨意更改。看看其他地方,就像你一樣。 – usr

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) 

...

+1

任何想法是什麼錯誤?這似乎是等同的。 – usr

+1

這也行不通,要麼。謝謝,不過。 – user1477388

1

你可以嘗試做一個左聯接和過濾的零記錄。無需數據再次進行測試,我不能肯定,如果它會工作「開箱即用」說,但我用下面的代碼多次做過濾這樣的:

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 }); 

的羣組加入/的SelectMany組合進行一個左連接,然後你可以過濾對象爲空的地方,它應該產生與NOT IN相同的東西。

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 };