Эффективный способ подзапросов в Linq - PullRequest
3 голосов
/ 18 ноября 2011

вот мой код linq:

BOOK entity = db.BOOKS
             .Where(s => s.ID == (from p in db.LIBRARY
                                  from b in db.BOOKS
                                  where (p.ID == 123) && (p.idpage == b.idpage)
                                  select b.fields));

Мой настоящий код оракула:

SELECT DISTINCT BOOKS.ID 
FROM LIBRARY,BOOKS 
WHERE LIBRARY.ID = 123 AND LIBRARY.ID = BOOKS.ID

Но он показывает ошибку в s.ID, что ..

Delegate 'System.Func Project.Models.BOOKS,int,bool' does not take 1 arguments

Почему это происходит?Есть ли обходные пути?

Ответы [ 4 ]

2 голосов
/ 18 ноября 2011

Ваш SQL использует соединение, так что вы можете сделать то же самое в LINQ.Любой из этих подходов будет достаточно:

// join
var query = (from b in db.BOOKS
            join p in db.LIBRARY on b.IdPage equals p.IdPage 
            where p.ID == 123
            select b.Id).Distinct();

// 2 from statements (SelectMany) can also be used as a join
var query = (from b in db.BOOKS
            from p in db.LIBRARY
            where p.ID == 123 && b.IdPage == p.IdPage 
            select b.Id).Distinct();

// fluent syntax
var query = db.BOOKS
              .Where(b => db.LIBRARY.Any(p =>
                  p.ID == 123 && b.IdPage == p.IdPage))
              .Select(b => b.Id)
              .Distinct();
1 голос
/ 18 ноября 2011

s.ID сравнивается с Enumerable, поэтому вы получаете ошибку.
В конце запроса LINQ добавьте SingleOrDefault ().

1 голос
/ 18 ноября 2011

Ваш подзапрос возвращает последовательность значений, а не отдельные значения, поэтому вы не можете сравнить его со скалярным свойством, таким как ID. Вы должны использовать First для результата подзапроса, чтобы получить первый результат (или Single, если должен быть только один)

BOOK entity = db.BOOKS
             .Where(s => s.ID == (from p in db.LIBRARY
                                  from b in db.BOOKS
                                  where (p.ID == 123) && (p.idpage == b.idpage)
                                  select b.fields).First());
0 голосов
/ 18 ноября 2011

Вы должны иметь возможность использовать свойства навигации в своем классе BOOKS, чтобы сделать что-то вроде этого:

var bookIds = db.BOOKS.Where(b => b.LIBRARIES.Any(l => l.ID == 123))
     .Select(b => b.ID)
...