2015-05-04 2 views
0

У меня есть две таблицы что-то вроде этого:Entity Framework внутреннее соединение

Клиенты:

  • Email
  • имя пользователя

Продукты:

  • Имя пользователя
  • Продукт

Я хочу заполнить класс именем, продуктом и электронной почтой.

Это то, что я так

var res = from H in db.Products 
      join C in db.customers on H.Username equals C.Username 
      where C.Username == H.Username 
      select H; 

Results results = res.Single(); 

Однако загвоздка в том, что я не знаю точно, как это работает, может кто-нибудь разбить его для меня?

+0

В чем именно вы не уверены? .Single() или результат, который сам запрос даст вам, ...? – Thomas

+0

Как его внутреннее соединение, он даст вам только результаты, которые имеют значения как в H, так и в C (где не обязательно, поскольку соединение уже имеет соответствующее значение), если вы не уверены в синтаксисе для внутреннего соединения: http : //stackoverflow.com/questions/37324/what-is-the-syntax-for-an-inner-join-in-linq-to-sql – Thomas

+0

@Thomas Мне интересно, какие значения я получу назад ... например, будет ли это популяризировать класс результатов с именем пользователя электронной почты и продукта? –

ответ

0
var res = from H in db.Products 
         join C in db.customers on H.Username equals C.Username 
         where C.Username == H.Username 
         select H; 

      Results results = res.Single(); 

Код выше делает внутреннее соединение между С и Н (где положение не является необходимым), и результаты во всех элементах возвращается, где соответствующим образом связанные продукты и клиенты входа существуют.

Выбор H "just" возвращает все данные из продуктов. Поскольку вы заявили, что хотите микшировать, вам нужно сделать это по-другому.

Я сам буду использовать анонимный тип (или объект dto). Для анонимного типа:

select new { Username = H.Username, Product = H.Product, EMail = C.EMail} 

Соединенный:

var res = from H in db.Products 
         join C in db.customers on H.Username equals C.Username 
         where C.Username == H.Username 
         select new { Username = H.Username, Product = H.Product, EMail = C.EMail} 

      Results results = res.Single(); 

Для DTO (объект передачи данных) вы можете создать класс с открытым набором/получить свойства и использовать выбрать новый MyClass() { ....} вместо select new {}.

DTOS лучше с точки зрения повторного использования, и что у вас есть меньше проблем с записью названия неправильно, что вы используете, ....


Просто выберите с помощью H, C, к сожалению, не может работать поскольку Linq хочет вернуть только отдельные объекты в строку (и, кроме того, всегда один и тот же тип данных). Таким образом, вам нужно поместить контейнер вокруг объектов, которые вы хотите вернуть. В этом случае либо анонимные типы, либо DTO.

+0

Конечно, контейнер может быть таким же простым, как 'new {Product = H, Customer = C}', с которым легко работать. – Luaan

Смежные вопросы