2013-11-28 6 views
1

Я изучаю LINQ. Кто-нибудь может помочь мне решить следующую проблему!LINQ Group by Clause with Where статья

От Борей «ы Клиенты и Заказы столы:

Я хочу "найти всех клиентов, которые сделали более 20 заказов"

запроса в SQL Server для то же самое:

SELECT * FROM Customers WHERE CustomerID in (SELECT CustomerID FROM Orders GROUP BY CustomerID HAVING COUNT(CustomerID) > 20) 

Но, я не мог напишите эквивалент в LINQ.

Я попытался, как показано ниже:

var customers = ctx.Customers.Where(o => o.CustomerID.Count() > 20).GroupBy(o => o.CustomerID); 

Я адресности следующее сообщение об ошибке в журнале событий:

Сведения об исключении: Тип исключения: HttpCompileException Сообщение об исключении: е: \ Ashok \ WEB \ VS2012 \ CSHWEB \ CSHWEB \ LINQ01.aspx (17): ошибка CS0103: имя «Заказы» не существует в текущем контексте

Причина в том, что зависимая таблица Заказов может быть еще не загружена. Но я не понимаю, как заставить его работать!

+1

Сообщите свой код –

+2

В каком контексте вы используете LINQ? Linq2Sql? EntityFramework? Первая модель? Первый код? Свободный? – mehrandvd

+0

@mehrandvd: LINT to SQL. Как здесь имеет смысл контекст? –

ответ

1

Ваши отношения между объектами должны быть правильно настроены. Если вы используете Entity Framework, просто отметьте Orders недвижимостью в Customers entity как virtual это позволит ленивую загрузку. Тогда ваш запрос будет намного проще. В противном случае вы можете начать с Orders вместо Customers:

var customers = ctx.Orders.GroupBy(c => c.CustomerID) 
          .Where(x => x.Count() > 20) 
          .SelectMany(g => g.Select(o => o.Customer)); 

А для клиентов (с virtual инкассовые) довольно проста:

var customers = ctx.Customers.Where(c => c.Orders.Count() > 20); 
+0

Привет, Спасибо за ваш ответ , Но ваш код не компилируется и отображается ошибка в g.Value –

+0

@Ashokkumar Обновлено. –

1

Если клиенты и заказы связаны (1: МНОГО), и вы создали объектную модель, чтобы отразить это можно сделать:

var customers = ctx.Customers.Where(c => c.Orders.Count() > 20); 

Если нет, то:

var customerIds = ctx.Orders.GroupBy(x => x.CustomerID) 
.Where(x => x.Count() > 20); 
.SelectMany(x => x.CustomerID); 

var customers = ctx.Customers.Where(x => customerIds.Contains(x.CustomerID)); 
+0

Привет, Спасибо за ваш ответ. Но ваш код не работает. Я получаю следующую ошибку: Имя «Заказы» не существует в текущем контексте Прошу вас проверить код перед отправкой ответа. –

1

Вы могли бы сделать что-то вроде этого:

var customers = from c in Customers where c.Orders.Count() > 20 select c; 
customers.GroupBy(o => o.CustomerID); 
+0

Привет, Ваш код выдает следующую ошибку: Название «Заказы» не существует в текущем контексте Просьба проверить код один раз перед отправкой. –

1

попробовать использовать join..into clause что-то вроде этого

var customers = from c in ctx.Customers 
       join o in ctx.Orders on c.CustomerID equals o.CustomerID into orders 
       where orders.Count()>20 
       select c; 
+0

Hi, Ваш код дает следующую ошибку: «Имя« Заказы »не существует в текущем контексте» –

+0

@Ashokkumar см. Msdn [Пошаговое руководство: создание классов LINQ to SQL (конструктор O/R)] (http://msdn.microsoft.com/ru-ru/library/bb384428.aspx) – Grundy

1

Для того, чтобы написать на такой запрос, необходимо использовать соотношение базы данных (Навигационное свойство). Это отношение должно быть объявлено в вашем контексте как Customer.Orders. После этого вы можете использовать Linq для запроса контекста. Посмотрите на пример, который описывает, что вам нужно.http://msdn.microsoft.com/en-us/library/bb425822.aspx

Однако вы можете объявить контекст как:

public partial class Northwind : DataContext 
{ 
    public Table<Customer> Customers; 
    public Table<Order> Orders; 
    public Northwind(string connection): base(connection) {} 
} 

и вы должны определить свой класс клиентов, как:

[Table(Name="Customers")] 
public class Customer 
{ 
    [Column(Id=true)] 
    public string CustomerID; 
    ... 
    private EntitySet<Order> _Orders; 
    [Association(Storage="_Orders", OtherKey="CustomerID")] 
    public EntitySet<Order> Orders { 
     get { return this._Orders; } 
     set { this._Orders.Assign(value); } 
    } 
} 

, то вы можете запросить его, как и другие ответы сказал.

+0

Надеюсь, вы видели мои комментарии для других ответов. –