Как использовать LINQ для фильтрации свойства дочерней коллекции с помощью (.Any ()) - PullRequest
4 голосов
/ 01 мая 2009

Как мне сделать следующий SQL в LINQ? Я на самом деле использую LINQ для NHibernate (но, возможно, это невозможно в NHibernate LINQ из-за встроенного лямбда-выражения, я думаю). Но я хочу знать, как вообще это сделать в LINQ. Я никогда раньше не сталкивался с такой ситуацией.

SELECT c.CustomerID, c.CustomerName --etc
FROM   Customers c
       INNER JOIN Orders o
         ON c.CustomerID = o.CustomerID
WHERE  o.Status = 1

public class Customer
{
  public int CustomerID { get; set; }
  public string CustomerName { get; set; }  
  public IList<Order> Orders { get; set; }
}

public class Order
{
  public int OrderID { get; set; }
  public int CustomerID { get; set; }
}

Я хочу сделать что-то похожее на это:

var customers = 
    (from c in Customers
    where c.Orders.Where(o => o.Status == 1)
    select c).ToList();

СПАСИБО!

Ответы [ 3 ]

11 голосов
/ 01 мая 2009

оператор where возвращает коллекцию. Вы хотите использовать метод Any ()

var customers = from c in Customers
                where c.Orders.Any(o => o.Status = 1)
                select c
0 голосов
/ 01 мая 2009

Вы ищете LAMBDA или прямой LINQ to SQL? Вы просто хотите присоединиться?

Вот соединение, использующее лямбду:

var lambda =
Customers.Join (
    Orders,
    c => c.CustomerID,
    o => o.CustomerID,
    (c, o) => new { c, o }
)
.Where  (w => w.o.Status == 1)
.Select (s => s.c.CustomerID, s.c.CustomerName);
0 голосов
/ 01 мая 2009

Это решение требует, чтобы в LINQ существовала связь между заказами и клиентом (т. Е. У клиента есть свойство Orders), но вы можете использовать:

  var customers = 
        (From c in Customers, o In c.Orders
        Where o.Status == 1 
        Select c).ToList()

Ура! * * 1004

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...