2010-01-27 2 views
3

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

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

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

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

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

 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(); 

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

+0

dup? http://stackoverflow.com/questions/2148309/how-do-i-reference-a-field-in-linq-based-on-a-dynamic-fieldname –

+0

@Rob - не обязательно; на первый можно ответить с отражением, но это может быть что-то еще ... –

+1

@saj - в чем заключается основная реализация LINQ здесь? LINQ к объектам? Entity Framework? LINQ к SQL? Это важно, к сожалению. –

ответ

3

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

+0

Безусловно, худший из обоих миров: динамический sql и linq. Великий. – NotMe

2

Если это 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 к SQL вы можете сделать это легко с помощью System.Linq.Expressions.Expression. Если вы дадите немного больше информации о типе nodeTable, я смогу провести вас через это.

+0

Привет, Джейсон, это linq to sql. Я предполагаю, что ваш ответ не будет применяться к linq к sql, хотя на первый взгляд я не могу понять, почему он будет работать на linq для объекта, а не для linq для sql. – saj

+0

И nodeTable имеет тип IQueryable . благодаря – saj

Смежные вопросы