Linq to Sql - выберите только определенную информацию (с помощью Predicate Builder) - PullRequest
2 голосов
/ 03 августа 2009

Я использую Linq to Sql с Predicate Builder и пытаюсь оптимизировать объем информации, получаемой из базы данных. Я хотел бы выбрать только определенные поля для отображения их в виде сетки. Когда я выбираю только то, что хочу, параметры поиска, которые я добавляю (см. Ниже), не работают, как и PredicateBuilder. Вот что я сейчас делаю (это работает, но получает ВСЕ, что слишком много информации)

    ' Initial Setup '
    Dim db As New MyDataContext()
    Dim results = From p In db.Products _
                  Select p

    ' Search '
    If (testCase) Then
        results = results.Where(Function(p) p.SomeAttribute = 123)
    End If

Если я изменю это, чтобы выбрать только то, что мне нужно, например:

    Dim results = From p In db.Products _
                  Select p.Name, p.SomethingElse

тогда я заметил, что если информация выбрана (т.е. я выбираю p.SomeAttribute), тогда я могу искать (добавить предложение where) по этому атрибуту, но если нет, я не могу. И с помощью построителя предикатов это работает, только если я выбираю весь элемент (то есть выбираю p). Все, что нужно сделать, это создать операторы SQL, которые не должны выбирать атрибут для поиска по нему. Как я могу заставить это работать и выбирать только то, что мне нужно, но искать по чему-либо и поддерживать работу prediate builder? Любая помощь очень ценится! Спасибо

Ответы [ 3 ]

1 голос
/ 03 августа 2009

Вы могли бы попытаться сначала сделать «select p» в начале, затем добавить все ваши предложения where, и в самом конце выбрать только то, что вам нужно.

' Initial Setup '
Dim db As New MyDataContext()
Dim results = From p In db.Products _
              Select p

' Search '
If (testCase) Then
    results = results.Where(Function(p) p.SomeAttribute = 123)
End If

' trim down the columns after you've added the wheres...
Dim results2 = from p in results
               Select p.Name, p.SomethingElse
1 голос
/ 03 августа 2009

Вы не можете изменить «список выбора» (так я понял ваш вопрос. Возможно, я его неправильно понял) с помощью построителя предикатов (который создает логические выражения). Для этого вы должны вручную использовать вещи в System.Linq.Expressions пространстве имен, но я предлагаю вместо этого использовать Dynamic LINQ .

0 голосов
/ 03 августа 2009

Звучит так, как будто вы выполняете проектирование на месте, а не на исходном продукте. Выполните проекцию Выберите p.Name, p.SomethingElse в конце после применения всех критериев поиска.

...