Динамическое создание (LLBLGen) запроса Linq со строками

StackOverflow https://stackoverflow.com/questions/248682

Вопрос

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

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

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

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

Любой совет, особенно в сочетании с LLBLGen, был бы замечательным!

Спасибо, Габ

Это было полезно?

Решение

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

Возможно, он не делает всего, что вам нужно, но может помочь вам в некоторой части пути.

РЕДАКТИРОВАТЬ.Я только что просмотрел пример кода, который был у Скотта Гу, и обнаружил, что он может выполнить ту часть выбора, которая вам нужна.Пример (это код Скоттса):

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#.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top