Почему я не получаю .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
после его конвертации.
Просто добавьте это для всех, кто сталкивался с таким же вопросом.