Проблема создания объекта Entity / запрашиваемого из результата соединения LINQ в MVC - PullRequest
1 голос
/ 12 августа 2011

Я пытаюсь написать функцию поиска для таблицы базы данных, которая должна получить доступ к информации из связанных таблиц, используя Entity Framework.Однако у меня возникают проблемы с получением данных из моего исходного запроса после объединения родительской таблицы и связанных таблиц.Мой код в настоящее время выглядит следующим образом.Я инициализирую свой запрашиваемый объект

IQueryable<PurchaseOrder> po = _context.PurchaseOrders;

, где PurchaseOrder является типом сущности.Затем есть ряд блоков, подобных этому.

if (!String.IsNullOrEmpty(searchViewModel.Comment)){
     var helper = _context.PurchaseOrderComments.Where(x => x.CommentText.Contains(searchViewModel.Comment));

     var mid = po.Join(helper, r => r.PurchaseOrderID, u => u.PurchaseOrderID, (r, u) =>
                new
                {
                    PurchaseOrderID = r.PurchaseOrderID,
                    PurchaseOrderNumber = r.PurchaseOrderNumber,
                    VendorID = r.VendorID,
                    ContractNumber = r.ContractNumber,
                    BuyerUserID = r.BuyerUserID
                });

     po = mid.Select(x => new PurchaseOrder
            {
                PurchaseOrderID = x.PurchaseOrderID,
                PurchaseOrderNumber = x.PurchaseOrderNumber,
                VendorID = x.VendorID,
                ContractNumber = x.ContractNumber,
                BuyerUserID = x.BuyerUserID
            });
 }

После каждого блока po передается следующему параметру поиска.Однако, как вы можете догадаться, моя программа жалуется на то, что я не могу создать сложный тип в операторе Select середины.Я также попытался создать объекты PurchaseOrder из содержимого mid, вставить их в новый список PurchaseOrders и преобразовать этот список в запрашиваемый запрос, чтобы назначить ему po для передачи в следующий блок.Однако это меняет тип данных po с System.Data.Object.ObjectSet на System.Collections.Generic.List, который затем генерирует исключение InvalidOperationException в следующий раз, когда я пытаюсь выполнить итерацию по нему, используя foreach.

Так что мойвопрос в том, есть ли какие-либо очевидные ошибки в моем подходе или какие-либо предложения для других способов решения проблемы?Большое спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

Я думаю, вы делаете это более сложным, чем нужно.Если я понимаю, что вы пытаетесь сделать, вы должны сделать что-то вроде этого:

if (!String.IsNullOrEmpty(searchViewModel.Comment)){
  po = po.Where(
     o => o.PurchaseOrderComments.Any(
       c => c.CommentText.Contains(searchViewModel.Comment)));
}
1 голос
/ 12 августа 2011

Решение StriplingWarrior - лучший способ.В случае, если у вашего PurchaseOrder класса действительно нет навигационной коллекции PurchaseOrderComments (что вынуждает вас использовать соединение), должно работать следующее и проще, чем ваш двойной проекции:

po=po.Join(helper, r => r.PurchaseOrderID, u => u.PurchaseOrderID, (r, u) => r);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...