Почему я не получаю .CopyToDataTable() в Linq Query()

Этот следующий пример кода заимствован из MSDN здесь. Я не получаю query.CopyToDataTable(), доступный в моем коде. (см. комментарий в моем следующем коде).

public static bool SetPhysicianAsNotonServer(DataTable dt)
        {
            DataTable dtPhysicianServer = dt;
            DataTable dtPhysicianClient = GetPhysicianClient();

            var query =
                from SPhysician in dtPhysicianServer.AsEnumerable()
                join CPhysician in dtPhysicianClient.AsEnumerable()
                on SPhysician.Field<string>("PhysicianNumber") equals
                    CPhysician.Field<string>("PhysicianNumber")
                select new
                {
                    PhysicianNumber = CPhysician.Field<string>("PhysicianNumber")
                 };

            DataTable FilterDt = query; //query.CopyToDataTable();
            //YET TO DO CODE HERE
            return true;
        }

Ответ 1

Ваш оператор select возвращает последовательность строк (IEnumerable<string> или IQueryable<string>), а не последовательность DataRows. CopyToDataTable() доступен только на IEnumerable<T>, где T является или получен из DataRow.

Вместо select new { ... } - который просто даст вам новую последовательность этого типа, попробуйте:

select CPhysician;

Который должен вернуть желаемую последовательность строк CPhysician.

Edit Если вы хотите преобразовать T-данные, не связанные с данными, в datatable, MSDN имеет класс образцов, который отражает любой тип и выполняет преобразование.

http://msdn.microsoft.com/en-us/library/bb669096.aspx

Ответ 2

Он существует в конкретном пространстве имён, который вы импортируете?

System.Data.DataTableExtensions.CopyToDataTable() 

Также подтвердите добавление этой ссылки

System.Data.DataSetExtensions 

Ответ 3

Я думаю, что, поскольку вы создаете анонимный тип для хранения объекта Field. Попробуйте следующее:

    var query = from SPhysician in dtPhysicianServer.AsEnumerable()
                join CPhysician in dtPhysicianClient.AsEnumerable()
                on SPhysician.Field<string>("PhysicianNumber") equals
                    CPhysician.Field<string>("PhysicianNumber")
                select CPhysician;

    DataTable FilterDt = query.CopyToDataTable();

Определение CopyToDataTable<T>:

public static DataTable CopyToDataTable<T>(
    this IEnumerable<T> source
)
where T : DataRow

Итак, то, что вы выбираете с запросом, должно быть типа IEnumerable<T>, где T extends DataRow

Ответ 4

Вам нужно обратиться к сборке System.Data.DataSetExtensions и использовать пространство имен System.Data.

Ответ 5

Вы ссылаетесь на сборку System.Data.DataSetExtensions? Этот метод расширения определен там.

Ответ 6

Навигация в MSDN онлайн приводит меня на эту страницу: http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.aspx

Он говорит об этом в пространстве имен System.Data(используя System.Data), и вам нужно ссылаться на System.Data.DataSetExtensions.dll.

Ответ 7

Эта проблема для меня была вызвана использованием Dotnet Core 2.0, который, похоже, не может превратить IEnumerable обратно в DataTable после его конвертации.

Просто добавьте это для всех, кто сталкивался с таким же вопросом.