Динамическое создание (LLBLGen) запроса Linq со строками
-
05-07-2019 - |
Вопрос
Нам нужно генерировать запросы 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#.