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 Клиента.

Другие вопросы по тегам