Как сделать динамическое предложение where: linq to sql - PullRequest
1 голос
/ 28 июня 2011

У меня следующий запрос linq:

        Dim q = From definition In definitionList _
            Where definition.ValueDefName.Contains(criteria) _
            Select definition.ValueDefName, definition.ValueDefDesc, definition.DateCreated, _
            definition.StrategicInitiative, definition.ValueWikiURL, definition.ValueDefinitionStatusID, _
            definition.Aliaslist

Я уже изучил этот ответ: Динамическое предложение WHERE в LINQ

К сожалению, это не такработать для меня, используя .net 4.0.Когда я пытаюсь передать строку критериев в нем, спрашиваю предикат.Конечная цель заключается в добавлении любого из них:

  1. Definition. ValueDefname. Содержит (критерии).Contains (Критерии)
  2. definition.StrategicInitiative.Contains (Критерии)

для передачи в запрос в зависимости от того, какие флажки выбрал пользователь.Как я могу создать динамическое предложение where в linq to sql?Есть ли новый синтаксис для передачи предложения where в виде строки?

Ответы [ 2 ]

1 голос
/ 28 июня 2011

Для LINQ to SQL подход Dynamic LINQ был бы единственным вариантом для передачи строки в качестве условия Where. В качестве альтернативы предложение Where принимает выражение, и вы можете динамически построить выражение, используя следующий подход: http://msdn.microsoft.com/en-us/library/bb882637.aspx

Я сделал это с помощью Entity Framework, я думаю, что это работает и с LINQ to SQL.

НТН.

0 голосов
/ 28 июня 2011

Не на 100% уверен, что это отвечает вашим потребностям, но мы используем функции лямбда-выражения, переданные в наши методы поиска:

В нашем классе репозитория:

public override IEnumerable<KeyCode> FindAll(Expression<Func<KeyCode, bool>> filter)
{
    return GetAll().AsQueryable().Where(filter);
}

И в каком-то другом месте

KeyCodeRepository keycodeRepository = new KeyCodeRepository(unitOfWork);
IEnumerable<KeyCode> keyCodes = keycodeRepository
    .FindAll(k => k.FlowStatus.Value == (int)FlowStatusType.Active 
                                    && k.AppSystem.Id == appSystemId);

Выражение

k.FlowStatus.Value == (int)FlowStatusType.Active && k.AppSystem.Id == appSystemId

передается в качестве выражения предложению Where в методе FindAll. Это позволяет нам динамически определять наши фильтры каждый раз, когда мы вызываем FindAll ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...