2010-09-15 2 views
2

Я использую проект LinqToExcel, разработанный MIT и размещенный в Google Code по адресу http://code.google.com/p/linqtoexcel/wiki/UsingLinqToExcel.Синтаксис LinqToExcel

Кажется довольно прямолинейным и элегантным. Мне удалось переписать метод, в котором использовалась библиотека взаимодействия MS excel, а код был около 1/3 размера.

Однако у меня возникла проблема с попыткой запросить диапазон ячеек. VS2008 воспринимает его как синтаксическую ошибку:

//These lines are fine 
    IEnumerable<string> names = new List<string>(); 
    var excel = new Excel.ExcelQueryFactory(_excelFilePath); 

    //This line shows a syntax error starting from c[0] 
    names = from c in excel.WorksheetRange("A1", "AI1", headerName) 
       c[0] == "IN" 
       select c; 

Линия - c [0] == "IN" - просто странно. Это должно захватить значение в ячейке A1. Если я удалю «c [0] == IN» Синтаксическая ошибка уходит, но она не возвращает результатов.

Правильно ли этот синтаксис? Является ли код на связанной странице C#?


ОБНОВЛЕНИЕ: После получения некоторых ответов кажется, что отсутствует «Где» - это действительно опечатка. Однако даже с «где» я не мог получить c [4] == «IN», чтобы вернуть ячейку A5. Я смог выполнить то, что мне нужно, удалив все предложение where where, которое вернуло мне весь указанный диапазон. В начальном посте я просто пытался вернуть единственную ценность - детские шаги :)

Ради маркировки ответа - как бы я вернул только одну ячейку в диапазоне? Возможно, == "IN" - это своего рода опечатка, а не фактическая конструкция LinqToExcel?

Спасибо за помощь!

+0

Какова была синтаксическая ошибка? –

ответ

6

Это должно было быть:

var names = from c in excel.WorksheetRange("A1", "AI1", headerName) 
      where c[0] == "IN" 
      select c; 
+0

Вы правы в том, что «Where» отсутствовал, но что-то не так с этим запросом, поскольку он не возвращает никаких результатов. – tpow

2

Я думаю, что вам нужно where там, может быть опечатка на странице док, вы пробовали

//These lines are fine 
    //IEnumerable<string> names = new List<string>(); removed this as not really needed 
    var excel = new Excel.ExcelQueryFactory(_excelFilePath); 

    //This line shows a syntax error starting from c[0] 
    var names = from c in excel.WorksheetRange("A1", "AI1", headerName) 
       where c[0] == "IN" 
       select c; 

редактировать обновляется, чтобы добавить var также необходимо

+0

Там также должен быть 'var'. – sshow

+0

@sshow вы правы, ответьте обновленно, спасибо – Pharabus

+1

@sshow Я так не думаю, что переменная 'names' уже определена выше. Однако лучше удалить первую декларацию, не так ли? –

1

Попробуйте это:

//These lines are fine 
    IEnumerable<string> names = new List<string>(); 
    var excel = new Excel.ExcelQueryFactory(_excelFilePath); 

    //This line shows a syntax error starting from c[0] 
    names = from c in excel.WorksheetRange("A1", "AI1", headerName) 
       where c[0] == "IN" 
       select c; 
+1

c [0] == «IN», опечатка: =) –

+0

это приводит к тому, что «Operator '==' не может применяться к LinqToExcel.Row и строке« Однако, когда я пытаюсь использовать «c» для string Я получаю то же самое, кроме ".... Группа методов и строка" – tpow

+0

@cinqo: Дэнни сказал, что я пропустил индекс в c. Исправлена. –

2

На этой странице показано около половины запросов, которые есть у where, а половина - нет. Я думаю, что это просто ошибка copy'n'paste. Это не является частью синтаксиса, который LinqToExcel будет контролировать.

Тем не менее, я отмечаю, что вы сказали, что без этой строки результаты не возвращаются. Это еще одна проблема, поскольку, без этой строки, должен был быть возвращен каждый ряд (хотя, если я правильно его читаю, ваш диапазон составляет только одну строку). Тем не менее, я предполагаю, что LinqToExcel работает как LinqToSql и LinkToObject, и что это ленивый оцененный, то есть он не выполняет запрос, пока вы не пройдите через него.

И еще один момент:

IEnumerable<string> names = new List<string>(); 
names = from c in excel.WorksheetRange("A1", "AI1", headerName) 
      where c[0] == "IN" 
      select c; 

Первая строка создает список строк, который затем сброшенная на следующей строке. Многие новые программисты на C#, похоже, думают, что новому нужно объявить тип переменной, но полностью обработанную здесь частью IEnumerable<string>. new не требуется.Эта линия может быть записана в виде:

IEnumerable<string> names = null; 

или просто

IEnumerable<string> names; 

или он может быть объединен со второй линией:

IEnumerable<string> names 
    = from c in excel.WorksheetRange("A1", "AI1", headerName) 
      where c[0] == "IN" 
      select c; 

или укороченной до:

var names = from c in excel.WorksheetRange("A1", "AI1", headerName) 
      where c[0] == "IN" 
      select c; 
+0

good point +1 re lazy evaluation – Pharabus

+0

Это было ваше сообщение, которое привело меня к удалению предложения Where, которая, в свою очередь, решила мою проблему. И спасибо за подсказку - вы правы, я новичок в C#! – tpow

0

Моя проблема возникает, когда вы просто хотите получить некоторые столбцы, передавая букву столбца, я нахожу это как условие.

var LetterColumn = {A, C, D} 
var clientData = from c in excelFile.WorksheetRangeNoHeader("A1", "G10", "Sheet1") 
.Where(c.contains(LetterColumn)) 
.Select c 

Image 1

Image 2

Очевидно, что это не будет работать, но более или менее это условие, которое я надеюсь, будут выполнены. Мой тип объекта: RowNoHeader

Спасибо!