Линк делает группу в лямбда-отбор - PullRequest
0 голосов
/ 23 февраля 2012

Я немного новичок в LINQ и Entity Framework, поэтому довольно простые запросы SQL вызывают у меня головную боль. У меня есть экран ввода пользователя, который позволяет им выбирать входные значения, и полученный запрос зависит от того, какие значения ввел пользователь. Полученный запрос группирует результаты, чтобы представить список уникальных клиентов

Упрощенный дизайн стола - клиент может находиться во многих штатах

Клиент
CustomerId
Имя
JoinDate

Штат
StateId
CustomerId

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

dim cust = from c in ctx.Customer
where c.Name = InputFromScreen
Select c.CustomerId, c.Name, c.JoinDate, C.State

Теперь, когда у меня есть базовый запрос LINQ, я могу использовать лямбда-выражения для дальнейшего сокращения набора запросов, в зависимости от ввода на экране (добавьте AND к где).

Пример: если пользователь ввел значение в поле даты присоединения:
cust = cust.Where(Function(c) c.JoinDate = DateFromScreen)

Однако я не могу понять, как добавить Where / Group для состояния, поскольку State - это навигация, а не таблица, и мне нужно только одну строку для клиентов, даже если у клиента несколько состояний

SQL для этого был бы довольно простым (и это не оптимально, но добавление AND для каждого элемента на экране - самый простой способ для примера)
select c.customerid, c.name
from customer c
where c.name = 'input' and c.JoinDate = 'input' and
c.customerid in (select customerid from state where state = 'IN')

Я думаю, это довольно просто.

1 Ответ

1 голос
/ 23 февраля 2012

Линк к сущностям, эквивалентный вашему запросу SQL, будет:

var customers = from c in ctx.Customer
                where c.States.Any(s=> s.State == "IN")
                select new { c.CustomerId, c.Name };

Предполагается, что у вас есть свойство навигации States вашего Customer объекта.

(Выше приведен синтаксис C #, я уверен, что VB несколько похож)

...