2014-12-09 2 views
1

Я столкнулся с библиотекой LinqToExcel и немного поиграл с ней. Кажется, я неправильно понимаю, как работает запрос. Я создал простой лист с информацией о клиенте. Использование LINQPad, я установки мой запрос, как так:Предикат не применяется в запросе LinqToExcel

void Main() 
{ 
    string path = @"E:\Documents\LINQPad\LINQPad Queries\LinqToExcel\Customers.xlsx"; 

    var excel = new ExcelQueryFactory(path); 

    // Mappings and Transforms: 
    excel.AddMapping<Customer>(c => c.Contact, "Contact Person"); 
    excel.AddMapping<Customer>(c => c.CompanyName, "Company Name"); 
    excel.AddMapping<Customer>(c => c.IsPreferred, "Preferred"); 
    excel.AddTransformation<Customer>(c => c.IsPreferred, cellValue => cellValue == "Yes"); 

    // Query: 
    var preferrdCompanies = from c in excel.Worksheet<Customer>("Customers") 
          where c.IsPreferred // this has no effect? 
          orderby c.CompanyName 
          select new { c.CompanyName, c.Contact, c.IsPreferred }; 

    // Display: 
    preferrdCompanies.Dump("Preferred Customers:"); 
} 

// Define other methods and classes here 
class Customer 
{ 
    public string Contact { get; set; } 
    public string CompanyName { get; set; } 
    public bool IsPreferred { get; set; } 
} 

По какой-то причине, предикат не применяется. Преобразование в true (bool) из текста «Да» работает. Если я пишу:

preferrdCompanies.ToList().Where(c => c.IsPreferred).Dump("Preferred Customers:"); 

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

Любой ответ/пояснение будет оценен, спасибо.

+0

При добавлении 'ToList' до' Where', то это, скорее всего, ошибка в LinqToExcel. –

+0

Это может быть; Я добавил ToList(), чтобы изменить набор результатов из ExcelQueryable <> в список <>, чтобы получить отфильтрованные результаты. Он действует так, как будто ExcelQueryable имеет способ принять предикат, но ничего не делает с ним. – Sleette

+0

Возможно; или есть ошибка в синтаксическом анализе, которая не обрабатывает логический столбец должным образом. –

ответ

0

Можете ли вы попытаться явно установить c.IsPreferred == true в предложении where и посмотреть, устраняет ли это вашу проблему.

var preferrdCompanies = from c in excel.Worksheet<Customer>("Customers") 
         where c.IsPreferred == true 
         orderby c.CompanyName 
         select new { c.CompanyName, c.Contact, c.IsPreferred }; 
+0

Как ни странно, если я добавлю c.IsPreferred == true (или false), он просто возвращает коллекцию без элементов. – Sleette

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