2012-02-25 37 views
12

Tôi đã đấu tranh với điều này một thời gian, vì vậy tôi hy vọng một số bạn QueryOver chuyên gia có thể giúp đỡ.Truy vấn mà id không có trong danh sách

Tôi có danh sách các bài đăng trên blog. Bạn có thể bỏ phiếu cho mỗi bài đăng trên blog và tôi muốn (trong số đó) nhận danh sách các bài đăng mà người dùng chưa bỏ phiếu.

Trước tiên tôi đã suy nghĩ về làm một cái gì đó như:

Session.QueryOver<BlogPost>() 
.WhereRestrictionOn(bp => bp.Id) 
.NotIn(existingBlogPostVotes); 

(existingBlogPostVoteIds là id của blogposts bình chọn)

Nhưng điều này không tồn tại trong khuôn khổ QueryOver.

tôi phát hiện ra rằng tôi có thể làm điều đó trong Tiêu chuẩn như thế này:

var crit = 
    Session.CreateCriteria<BlogPost>() 
    .Add(Restrictions.Not(Restrictions.In("Id",existingBlogPostVotes))); 

Nhưng tôi sẽ làm điều này trong QueryOver và không tiêu.

Điều này sẽ được thực hiện như thế nào trong QueryOver?

Trả lời

23

Làm thế nào về Not.IsIn():

Session.QueryOver<BlogPost>() 
      .WhereRestrictionOn(bp => bp.Id) 
      .Not.IsIn(existingBlogPostVotes); 

Tùy chọn này có thể được thực hiện trong Nhà cung cấp LINQ:

Session.Query<BlogPost>() 
      .Where(bp => !existingBlogPostVotes.Contains(bp.Id)); 
+0

Cảm ơn đây chính xác là những gì tôi đang tìm kiếm. – Dofs

1

Điều gì về truy vấn chuẩn mà bạn sử dụng truy vấn phụ trong mệnh đề where. Tôi không có phòng thu trực quan của tôi để xác minh cú pháp, nhưng về cơ bản điều này là quering tất cả các bài viết Blog, nơi không tồn tại một bản ghi blogPostVote cho người dùng hiện tại.

Session.QueryOver<BlogPost>() 
.Where(bp => bp.Id) 
.Where(
    !Session.QueryOver<BlogPostVotes>() 
    .Where(blogPostVotes => blogPostVotes.BlogPostId == bp.Id) 
    .Where(blogPostVotes => blogPostVotes.UserId == currentUserId) 
    .Any()); 

Điều đó sẽ cho bạn kết quả mà bạn đang tìm kiếm. Tôi biết cú pháp của tôi sẽ làm việc trong LINQ to SQL, nếu nó không làm việc cho NHibernate, nhìn vào câu trả lời này đây (Subqueries with QueryOver)

Các vấn đề liên quan