Создать (LLBLGen) Linq-запрос динамически со строками - PullRequest
2 голосов
/ 30 октября 2008

Нам нужно сгенерировать запросы LINQ, которые на 100% неизвестны во время кодирования (время разработки). Это потому, что логика доступна в нашей среде, которая на 100% отделена от любых проектов данных. Для данных мы используем сгенерированный LLBLGen код доступа к данным.

Обычно, используя вызовы DLL, которые мы указываем для каркаса (не для ссылки), мы можем создать код для извлечения данных. Но теперь нам нужно сделать это с помощью linq. Как мы можем создать запрос как:

var q = from customer in m.Customer
        select new
        {                   
            customer.Number,
            customer.City,
            customer.CountryEntity.Name             
        };

только из строк. У нас будет 1 строка с именем «customer», поэтому мы знаем, что мы должны получить данные от Customer. Тогда у нас будет строка [], содержащая имена полей, которые мы хотим получить. Как видите, эти столбцы могут включать сложные типы (связанные поля).

Любой совет, особенно в сочетании с LLBLGen, был бы великолепен!

Спасибо, Габ

1 Ответ

1 голос
/ 30 октября 2008

Я не уверен, что это именно то, что вы ищете, но Скотт Гу имеет пост в своем блоге об использовании динамического LINQ. http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Он может делать не все, что вам нужно, но может помочь вам.

EDIT. Я просто посмотрел пример кода, который имел Скотт Гу, и обнаружил, что он может выполнять ту часть выбора, которая вам нужна. Пример (это код Скотта):

Dim query = db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). _
                OrderBy("CompanyName"). _
                Select("New(CompanyName as Name, Phone)")

Как видите, нижний бит имеет динамический выбор.

Кроме того, чтобы решить проблему динамического определения того, какой объект запрашивать во время выполнения, вы можете сделать что-то вроде этого:

 Sub query(Of T)(ByVal Myobject As IQueryable(Of T))
    Dim i = Myobject.Select("New(customer.Number)")
 End Sub

Тогда вы можете просто сделать небольшое переключение после чтения имен из базы данных, например:

Sub PassIt()
    Dim name = "customer"
    Select Case name
        Case "customer"
            query(m.Customer)
    End Select
End Sub

Надеюсь, это поможет. Заметка! Был бы лучший способ выполнить последнюю часть (метод passit), но рано утром думать об этом.

Извините, ответ в VB, я должен был сделать это в C #

...