вложенные запросы linq-to-sql - PullRequest
3 голосов
/ 17 мая 2010
var result = (
    from contact in db.Contacts                             
    join user in db.Users on contact.CreatedByUserID equals user.UserID
    orderby contact.ContactID descending
    select new ContactListView
    {
        ContactID = contact.ContactID,
        FirstName = contact.FirstName,
        LastName = contact.LastName,
        Company = (
            from field in contact.XmlFields.Descendants("Company")
            select field.Value).SingleOrDefault().ToString()
    }).Take(10);

Здесь Я описал, как выглядят мои таблицы базы данных. Итак, таблица contacts имеет одно поле типа xml. В этом поле хранится имя компании, и мне нужно прочитать его. Я попробовал это так:

Company = (
    from field in contact.XmlFields.Descendants("Company")
    select field.Value).SingleOrDefault().ToString()

но я получаю следующую ошибку:

Доступ участника 'System.String Value' из «System.Xml.Linq.XElement» не является законным по типу «System.Collections.Generic.IEnumerable`1 [System.Xml.Linq.XElement].

Есть какое-нибудь решение для этого?

Заранее спасибо,
Ile

1 Ответ

3 голосов
/ 17 мая 2010

Проблема здесь в том, что LINQ to SQL пытается преобразовать метод расширения Descendants и XElement.Value в SQL, но это, конечно, не удается. Вы должны будете сделать это последнее преобразование с LINQ to Objects. Это будет работать:

var temp = (
    from contact in db.Contacts                             
    join user in db.Users on contact.CreatedByUserID equals user.UserID
    orderby contact.ContactID descending
    select new
    {
        contact.ContactID, contact.FirstName, contact.LastName, contact.XmlFields
    })
    .Take(10);

var tempArray = temp.ToArray();

IEnumerable<ContactListView> result =
    from contact in tempArray
    let company =
        (from field in contact.XmlFields.Descendants("Company")
         select field.Value).SingleOrDefault()
    select new ContactListView()
    {
        ContactID = contact.ContactID,
        FirstName = contact.FirstName,
        LastName = contact.LastName,
        Company = company == null ? null : company.ToString()
    }).Take(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...