Я довольно новичок в LINQ и не могу понять некоторые противоречия в поведении. Любой знающий вклад будет высоко ценится. Я вижу похожие проблемы в SO и в других местах, но, похоже, они не помогают.
У меня очень простая настройка - таблица компании и таблица адресов. У каждой компании может быть 0 или более адресов, и если> 0, один должен быть указан в качестве основного адреса. Я пытаюсь обработать случаи, когда есть 0 адресов, используя внешнее соединение и соответственно изменяя оператор выбора.
Обратите внимание, что в настоящее время я связываю вывод прямо с GridView, поэтому я хотел бы сохранить всю обработку в запросе.
Следующие ДЕЛАЕТ РАБОТАЕТ
IQueryable query =
from comp in context.Companies
join addr in context.Addresses on comp.CompanyID equals addr.CompanyID into outer // outer join companies to addresses table to include companies with no address
from addr in outer.DefaultIfEmpty()
where (addr.IsMain == null ? true : addr.IsMain) == true // if a company has no address ensure it is not ruled out by the IsMain condition - default to true if null
select new {
comp.CompanyID,
comp.Name,
AddressID = (addr.AddressID == null ? -1 : addr.AddressID), // use -1 to represent a company that has no addresses
MainAddress = String.Format("{0}, {1}, {2} {3} ({4})", addr.Address1, addr.City, addr.Region, addr.PostalCode, addr.Country)
};
но при этом в GridView отображается пустой адрес как ", , ()
"
Итак, я обновил поле MainAddress, чтобы оно было
MainAddress = (addr.AddressID == null ? "" : String.Format("{0}, {1}, {2} {3} ({4})", addr.Address1, addr.City, addr.Region, addr.PostalCode, addr.Country))
и теперь я получаю ошибку Could not translate expression
и кучу автоматически сгенерированного кода ошибки, который для меня очень мало значит.
Условие, которое я добавил в MainAddress, ничем не отличается от рабочего условия для AddressID, поэтому кто-нибудь может сказать мне, что здесь происходит?
Любая помощь очень ценится.