LINQ to SQL - Поиск столбца объединенной таблицы
Я пытаюсь вернуть набор результатов, который включает в себя строки, где любая из трех строк имеет совпадение строк. Мои доменные модели выглядят так:
public class Customers
{
public int CustomerID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class BidNames
{
public int BidNameID { get; set; }
public int CustomerID { get; set; }
public string BidName { get; set; }
}
Существует FK между BidName.CustomerID и Customers.CustomerID, и это отношение один-ко-многим, когда для одного Клиента может быть несколько BidNames. При поиске в моей таблице клиентов я хочу вернуть все записи, в которых есть совпадения строк в FirstName, LastName или любом из связанных BidNames. Для этого примера я буду использовать строку поиска BidName "ba".
from c in Customers
where c.FirstName.Contains("ba") || c.LastName.Contains("ba") || c.BidNames.Any(b=>BidNames.BidName.Contains("ba"))
orderby c.LastName, c.FirstName
select new { CustomerID = c.CustomerID, FirstName = c.FirstName, LastName = c.LastName }
Все это работает, пока я не добавлю окончательные критерии в предложении Where. Я понимаю, что c.BidNames - это коллекция, и я смотрю, есть ли у кого-нибудь из них BidName, который содержит "ba". Там, где я сталкиваюсь с проблемами, я пытаюсь указать столбец BidNames.BidName для поиска строки. Код, который я написал выше, завершается с ошибкой "BidNames не содержит определения" BidName ""
Как мне написать последнюю часть предложения Where, чтобы я мог найти все поля BidNames.BidName, связанные с записью Customer? Я надеюсь и предполагаю, что смогу использовать тот же синтаксис, чтобы указать поле BidName в orderby и выбрать предложения.
Большое спасибо,
BK
ЗАКЛЮЧИТЕЛЬНЫЙ ОТВЕТ:
from c in Customers
where
c.FirstName.Contains("ba") ||
c.LastName.Contains("ba") ||
c.BidNames.Any(b=>b.BidName.Contains("ba"))
orderby
c.LastName,
c.FirstName
select new {
CustomerID = c.CustomerID,
FirstName = c.FirstName,
LastName = c.LastName,
BidNames = c.BidNames.OrderBy(b=>b.BidName)
}
1 ответ
Попробуйте изменить условие where на
Where c.FirstName.Contains("ba") ||
c.LastName.Contains("ba") ||
c.BidNames.Any(b=>b.BidName.Contains("ba"))
В вашем предложении Any, b является экземпляром класса BidNames, поэтому вы хотите получить доступ к его свойствам, а не к свойству BidNames Клиента.