Проблемы с запросами Linq - определение столбца во время выполнения - PullRequest
3 голосов
/ 27 января 2010

У меня есть вопрос linq (linq to sql). У меня есть следующий кусок кода, который отлично работает;

       var queryx = (from sa in d1.SampleAttributes
                      where nodeTable.ToList().Distinct().Contains(sa.client_post_code_prefix)
                     select sa.SampleId).Distinct();

Примечание: nodeTable имеет тип IQueryable

Однако я хотел бы изменить это так, чтобы имя столбца в методе содержимого могло быть определено во время выполнения. Я определяю имя столбца из другого запроса, зависящего от применяемых определенных пользовательских фильтров, и в идеале хотелось бы что-то с следующей логикой;

// обратите внимание, что строка, которую я передаю для получения «объекта столбца», всегда имеет то же имя, что и столбец

        var columnWhatever = GetColumnName(string colName);

        var queryx = (from sa in d1.SampleAttributes
                      where nodeTable.ToList().Distinct().Contains(sa.client_post_code_prefix)
                     select sa.SampleId).Distinct();

До сих пор я не смог найти ничего, что позволило бы это, и я начинаю думать, что Linq не допускает такой логики. Любая помощь будет высоко ценится

Ответы [ 2 ]

3 голосов
/ 27 января 2010

Вы можете взглянуть на библиотеку Dynamic LINQ. Я написал об этом здесь . Посмотрите и посмотрите, может ли это вам помочь. Также см. Пост Скотта Гатри об этом здесь .

2 голосов
/ 27 января 2010

Если это LINQ для объекта, вы можете сделать это очень легко, используя отражение. Для остроумия:

string colName;
var queryx = (from sa in d1.SampleAttributes
              where nodeTable.Contains(
                                 sa.GetType()
                                   .GetProperty(colName)
                                   .GetValue(sa, null)
                                   .ToString()
                             )
              select sa.SampleId).Distinct();

Предполагается, что nodeTable является IEnumerable<string>.

Было бы лучше выполнить отражательную часть только один раз. Скажем, что тип времени компиляции sa равен SampleAttribute. Тогда вы можете сделать следующее:

string colName;
PropertyInfo info = typeof(SampleAttribute).GetProperty(colName);
Func<SampleAttribute, string> func = sa => info.GetValue(sa, null).ToString();
var queryx = (from sa in d1.SampleAttributes
              where nodeTable.Contains(func(sa))
              select sa.SampleId).Distinct();

Если это LINQ to SQL, вы можете легко сделать это, используя System.Linq.Expressions.Expression. Если вы дадите немного больше подробностей о типе nodeTable, я могу рассказать вам об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...