LinqToExcel: Как исключить определенные строки?

Я боролся с этим в течение нескольких дней, и я в тупике. Я надеюсь, что кто-то может предложить альтернативное предложение. По сути, я читаю данные из Excel, используя LinqToExcel. Но я хочу исключить все строки с "рейтингом" из "NR". Вот образец моих данных:

CompanyName Rating  SalesMan
Apple       2       Steve
Google      NR      Steve
Microsoft   3       John
Dell        1       Steve
Pepsi       3       John

Я просто хочу найти все компании, которые принадлежат Стиву, но не имеют рейтинга "NR". Мой окончательный список должен быть:

CompanyName SalesMan
Apple       Steve
Dell        Steve

Я пробовал следующий код, но он не работает:

1)

var masterList = masterDataXL.Worksheet("data_all").Where(d => !d["Rating"].Equals("NR"));

2)

var masterList = masterDataXL.Worksheet("data_all")
    .Where(m =>
        !m["Rating"].Equals("NR")
        &&
        m["SalesMan"].ToString().Contains(resAnLastName)) // check for last name
    .Select(m => new ResAnTicksDataClass
    {
        Company = m["CompanyName"],
        Rating = m["Rating"],
        Seller = m["SalesMan"]
    }).AsEnumerable();

3) Создал свойство для рейтинга и сделал следующее:

var masterList = masterDataXL.Worksheet("data_all")
.Where(m =>
    m["Analyst"].ToString().Contains(resAnLastName)) // check for last name
.Select(m => new ResAnTicksDataClass
{
    Company = m["CompanyName"],
    Rating = m["Rating"],
    Seller = m["SalesMan"]
}).AsEnumerable();
var dataList = (from m in masterList
where m.Rating != "NR"
select new ResAnTicksDataClass
{
    ResAnName = m.ResAnName,
    DescrTick = m.DescrTick
}).AsEnumerable();

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

2 ответа

Решение

Я предлагаю вам выбрать столбец "Рейтинг" в файле Excel, выполнить поиск и заменить выбор (измените "NR" на "0"), а затем отфильтровать. Должно помочь использование одного типа данных.

Как сказал Фог, преобразуя файлы Excel в таблицу, в этой таблице необходимо указать тип каждого столбца. Для этого он будет смотреть только 10 первых строк вашего файла Excel. Таким образом, если ваш файл не имеет значения 'NR' в первых 10 строках, он установит тип столбца в INTи, следовательно, не удалось преобразовать значение "NR". Простой способ исправить это - добавить строку в ваш файл Excel, непосредственно перед первой строкой данных, с данными, используя тип данных, который вы хотите использовать.

Например, если в столбце используются текстовые значения, а иногда в тексте используется более 255 символов, убедитесь, что первые 10 строк содержат как минимум 1 текстовое значение, используя 256 символов. Иначе, как только он создаст таблицу, столбец будет установлен в VARCHAR(255) вместо VARCHAR(MAX) а затем сбой при преобразовании текстов длиннее 255 символов.

Вывод: всегда убедитесь, что первые 10 строк используют правильный тип и размер, чтобы соответствовать всем строкам вашего файла Excel!

В первом примере вы должны изменить это:

d => !d["Rating"].Equals("NR")

к этому:

d => d["Rating"] != "NR"

Это также может быть написано более чистым способом:

var masterList = 
    from d in masterDataXL.Worksheet("data_all")
    where d["Rating"] != "NR"
    select d;
Другие вопросы по тегам