2009-08-03 3 views
2

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

' 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, которым не нужно выбирать атрибут для его поиска. Как я могу заставить это работать и выбирать только то, что мне нужно, но искать что-нибудь и поддерживать работу предшественника? Любая помощь МНОГО ПРИЗНАВАЕТСЯ! Спасибо

ответ

1

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

' 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 
+0

Привет, я уже пробовал это, и он дает эту ошибку: Невозможно наложить объект типа 'System.Data.Linq.DataQuery'1 [VB $ AnonymousType_0'3 [System.Int32, System.Int32, System .String]] 'для ввода' System.Linq.IQueryable'1 [MyNamespace.Product] '. Любые идеи вокруг этого? – Ryan

+0

В моем примере была ошибка, которая даст эту ошибку - я обновил пример, чтобы исправить ошибку. –

+0

Я получил это сразу после того, как прокомментировал это, извините. Но ваше решение именно то, что я искал. Благодаря! – Ryan

1

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

0

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

+0

Эй, я пробовал то, что, как я думаю, вы говорите (если это похоже на ответ выше), чтобы выбрать все после того, как я его обыскал, и получаю эту ошибку: Невозможно наложить объект типа «System.Data.Linq. DataQuery'1 [VB $ AnonymousType_0'3 [System.Int32, System.Int32, System.String]] 'для ввода' System.Linq.IQueryable'1 [MyNamespace.Product] '. Вы знаете, как обойти это? – Ryan