Вопрос:

Visual Studio 2015 LinqToExcel не работает

c# linq-to-excel

552 просмотра

3 ответа

273 Репутация автора

У меня есть приложение asp.net, написанное на VS2012. Я без проблем использовал LinqToExcel, пока не перешел на VS2015. Вот мой код:

var excel = new ExcelQueryFactory(fileName);
var entriesQuery = from entry in excel.Worksheet<VEntry>(0)
                                      where entry.MovieTitle != null
                                      select entry;

                var entries = entriesQuery.ToList();

VEntry класс

public class VEntry
    {
        [ExcelColumn("id kolekcji")]
        [DefaultValue("")]
        public String CollectionId { get; set; }

        [ExcelColumn("nazwa kolekcji")]
        [DefaultValue("")]
        public String CollectionName { get; set; }

        [ExcelColumn("Tytuł serialu/serii/filmu")]
        [DefaultValue("")]
        public String MovieTitle { get; set; }

        [ExcelColumn("Tytuł odcinka")]
        [DefaultValue("")]
        public String EpisodeTitle { get; set; }

        [ExcelColumn("Sezon")]
        [DefaultValue("")]
        public String Season { get; set; }

        [ExcelColumn("nr odcinka")]
        [DefaultValue("")]
        public String EpisodeNumber { get; set; }

        [ExcelColumn("Start")]
        public DateTime StartDate { get; set; }

        [ExcelColumn("Koniec")]
        public DateTime EndDate { get; set; }

        [ExcelColumn("Kategoria tematyczna")]
        [DefaultValue("")]
        public String Category { get; set; }

        [ExcelColumn("Cena")]
        [DefaultValue("")]
        public String Price { get; set; }

        [ExcelColumn("kategoria wiekowa")]
        [DefaultValue("")]
        public String AgeCategory { get; set; }

        [ExcelColumn("Seria (0/1)")]
        [DefaultValue("")]
        public bool IsSeries { get; set; }

        [ExcelColumn("box set (0/1)")]
        [DefaultValue("")]
        public bool IsBoxSet { get; set; }

        [ExcelColumn("Cały sezon")]
        [DefaultValue("")]
        public bool IsFullSeason { get; set; }
    }

На VS2012 все работало нормально. Когда я строю его в VS2015, я получаю исключение в строке

var entries = entriesQuery.ToList();

:

Object must implement IConvertible.

   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at LinqToExcel.Extensions.CommonExtensions.Cast(Object object, Type castType)
   at LinqToExcel.Extensions.CommonExtensions.Cast[T](Object object)
   at LinqToExcel.Extensions.CommonExtensions.IsNullValue(Expression exp)
   at LinqToExcel.Query.WhereClauseExpressionTreeVisitor.VisitBinaryExpression(BinaryExpression bExp)
   at LinqToExcel.Query.SqlGeneratorQueryModelVisitor.VisitWhereClause(WhereClause whereClause, QueryModel queryModel, Int32 index)
   at Remotion.Data.Linq.QueryModelVisitorBase.VisitBodyClauses(ObservableCollection`1 bodyClauses, QueryModel queryModel)
   at LinqToExcel.Query.SqlGeneratorQueryModelVisitor.VisitQueryModel(QueryModel queryModel)
   at LinqToExcel.Query.ExcelQueryExecutor.GetSqlStatement(QueryModel queryModel)
   at LinqToExcel.Query.ExcelQueryExecutor.ExecuteCollection[T](QueryModel queryModel)
   at Remotion.Data.Linq.Clauses.StreamedData.StreamedSequenceInfo.ExecuteQueryModel(QueryModel queryModel, IQueryExecutor executor)
   at Remotion.Data.Linq.QueryProviderBase.Execute[TResult](Expression expression)
   at Remotion.Data.Linq.QueryableBase`1.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Logic.Importers.VodImporter.VodImporter.Run(String fileName, Boolean publishAfterImport) in C:\ncplus\npl\Logic\Importers\VodImporter\VodImporter.cs:line 103
   at Website.sitecore_modules.Shell.Editors.VodImporterEditor.Page_Load(Object sender, EventArgs e)

Но когда я собираю его в VS2012, он снова работает. Что может быть не так? Я понятия не имею.

Изменить: На VS2013 это тоже работает.

Автор: petros Источник Размещён: 09.11.2015 01:23

Ответы (3)


0 плюса

105 Репутация автора

Я предполагаю, что MovieTitle не принимает нулевые значения в вашей модели. Если это так, измените условие where на следующее.

var entriesQuery = from entry in excel.Worksheet<VEntry>(0)
                                  where entry.MovieTitle != string.Empty
                                  select entry;
Автор: ecasper Размещён: 04.10.2016 12:24

0 плюса

1 Репутация автора

vs 2015 используйте компилятор roselyn и поставщик кодедом, удалите их

Автор: user7989118 Размещён: 10.05.2017 01:47

0 плюса

1 Репутация автора

Старый пост, который я знаю, но я не могу заставить LinqToExcel работать с Visual Studio 2017 после его многолетнего использования с Visual Studio 2010. Взрывает просто настройка ExcelQueryFactory. Во всяком случае, после получения последней информации от Nuget и все еще с ее неудачей, я решил написать свою собственную версию (см. Ниже). Короче говоря, вы передаете ему пустой List (Of YourObjectName) и рабочую таблицу Excel Interop, в которой заголовки столбцов 1-й строки дословно именуют свойства объекта. Функция возвращает все строки под строкой заголовка в виде объектов, и оттуда я могу сделать свой собственный linq для них. Надеюсь, это кому-нибудь поможет.

 Private Sub GetObjectsFromExcelWorksheet(ByRef listObjects As Object, '
                                             ByVal ws As Microsoft.Office.Interop.Excel.Worksheet)
        'Fancy code that gets the type of the objects passed in a list
        Dim objType = (listObjects.GetType.GetGenericArguments())(0)

        Dim headers As New List(Of String)
        Dim A1 = ws.Range("A1")
        Dim nHeaders = ws.UsedRange.Columns.Count
        For i = 0 To nHeaders - 1
            Dim header = A1.Offset(0, i).Value
            headers.Add(header)
        Next
        For i = 1 To ws.UsedRange.Rows.Count - 1
            Dim newObj = Activator.CreateInstance(objType)
            For j = 0 To nHeaders - 1
                CallByName(newObj, headers(j), CallType.Set, A1.Offset(i, j).Value)
            Next
            listObjects.Add(newObj)
        Next
    End Sub
Автор: Robert Norsworthy Размещён: 13.06.2019 06:11
Вопросы из категории :
32x32