2013-07-18 391 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 };