2017-02-19 5 views
0

Мне нужно написать динамический LINQ, где я ничего не знаю о входной таблице - поставщике данных (именно поэтому я использую LINQ to SQL), нет таблицы имя, ничего. Я хочу, чтобы иметь возможность запрашивать данные, данные выбранные пользователем поля и заданные значения, что-то вроде следующего:Передача ITable в IEnuerable <object> - Динамический запрос LINQ to SQL без данных DataTable

Имея StringTheTableName и System.Data.Linq.DataContextTheContext:

IEnumerable<object> GetQuery(List<string> theWhereFields, List<string> theWhereValues) 
    { 
     // for doing dynamically ala http://stackoverflow.com/a/25859319/3661120    

     var baseTable = (ITable)TheContext.GetType() 
          .GetProperty(TheTableName).GetValue(TheContext, null); // http://stackoverflow.com/a/1924966/3661120      

     IEnumerable<object> query = (IEnumerable<object>) baseTable; 
     for (int i = 0; i < theWhereFields.Count; i++) 
     { 
      var whereField = theWhereFields[i]; 
      var whereValue = theWhereValues[i]; 
      query = query.Where(whereField + "=" + whereValue); // possible due to System.Linq.Dynamic 
     } 

     return query;    
    } 

Правильно ли бросить ITable до IEnumerable<object>, как я здесь сделал?

Примечание ITable от System.Data.Linq, https://msdn.microsoft.com/en-us/library/system.data.linq.itable(v=vs.110).aspx

+0

Что такое 'ITable'? – CodingYoshi

+0

См. Здесь: https://msdn.microsoft.com/en-us/library/system.data.linq.itable(v=vs.110).aspx. Это IQueryable, но не обязательно IEnumerable. – dashnick

+0

TheContext - это DataSet, так как вы знаете, какую таблицу вы хотите? – jdweng

ответ

1

Короткий ответ

NO.

Длинный ответ

ITable имеет эту подпись:

public interface ITable : IQueryable, IEnumerable 

Если у вас есть экземпляр типа, который реализует что, как показано ниже:

public class MyTable : System.Data.Linq.ITable 
{ 
    // Implementation ... 
} 

И вы это делаете :

var myTable = new MyTable(); 
var iterator = myTable as IEnumerable<Object>; 

Он будет возвращать null, потому что MyTable реализует ITable, и оба они не реализуют интерфейс IEnumerable<T>.

Однако, это будет работать:

var iterator = myTable as IEnumerable; // or IQueryable 

Поэтому в зависимости от того, что вы имеете в виду Is it correct to cast the ITable to an IEnumerable<object> as I've done here. Он не будет генерировать исключение, но он никогда не приведет к чему-либо до тех пор, пока вы его не используете, и он взорвется с нулевым ссылочным исключением в этой строке:

query = query.Where(whereField + "=" + whereValue); 
+0

Хорошо, спасибо. Думаю, я просто использую 'IQueryable'. – dashnick

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