Entity Framework - объединение данных в две строки - PullRequest
1 голос
/ 16 декабря 2011

У меня есть две таблицы.

Orders
OrderID | UserID | OrderTotal
1       |    1   |  100
2       |    2   |  110
3       |    1   |  120

Users
UserId | ProprtyType | PropertyValue
1      |     1       |    Kevin
1      |     2       |    Nolan
1      |     1       |    FirstName
1      |     2       |    Surname

Использование следующего запроса

var query = from orders in context.Orders
join users in context.Users on orders.UserID equals user.UserID
where userData.Type == 211 || userData.Type == 212

1       |    1   |  100 | Kevin
1       |    1   |  100 | Nolan
2       |    2   |  110 | FirstName
2       |    2   |  110 | Surname
3       |    1   |  120 | Kevin
3       |    1   |  120 | Nolan

Возможно ли в работе фрейма Entity объединить результаты, чтобы он возвратил следующее

1       |    1   |  100 | Kevin     | Nolan
2       |    2   |  110 | FirstName | Surname
3       |    1   |  120 | Kevin     | Nolan

Или

1       |    1   |  100 | Kevin Nolan
2       |    2   |  110 | FirstName Surname
3       |    1   |  120 | Kevin Nolan

Спасибо

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

Что Пользователи Таблица действительно плохо спроектирована, ИМО.Если вы сохраняете макет таблицы, переименуйте его UserProperties .Кроме того, ваш пример кода не соответствует разметке таблицы или предлагаемым результатам.

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

var firstnames = from user in context.Users
                 where user.PropertyType == 1
                 select new { Id = user.UserID,
                              Firstname = user.PropertyValue };

var lastnames = from user in context.Users
                where user.PropertyType == 2
                select new { Id = user.UserID,
                             Lastname = user.PropertyValue };

var users = from fn in firstnames
            join ln in lastnames on fn.Id equals ln.Id
            select new { Id = fn.Id,
                         Firstname = fn.Firstname,
                         Lastname = ln.Lastname };

var query = from order in context.Orders
            join user in users on order.UserID equals user.Id
            select new { /*what you need to select*/ };

Одна хорошая вещь в Entity Framework - эточто фактические запросы SQL откладываются как можно дольше.Так что просто запрос имени и фамилии не будет генерировать соединение с базой данных.Это приходит позже.К сожалению, из-за дизайна вашего стола эти преимущества EF действительно затруднены.

1 голос
/ 16 декабря 2011

Согласитесь с ответом atornblad, но просто хотели бы отметить, что вам не нужно полагаться на отложенное выполнение, чтобы получить имя и фамилию. Вы можете присоединиться к одной и той же таблице дважды, подобно тому, как вы бы добавили псевдоним к таблице, чтобы присоединиться к ней несколько раз в SQL-запросе:

var query = from o in Orders
            join fn in Users on o.UserId equals fn.UserId
            join ln in Users on fn.UserId equals ln.UserId
            where fn.PropertyType == 1 && ln.PropertyType == 2
            select new 
            { 
                OrderId = o.OrderId, 
                UserId = fn.UserId, 
                Total = o.OrderTotal, 
                FirstName = fn.PropertyValue, 
                LastName = ln.PropertyValue 
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...