Вы должны различать таблицы Power Query и таблицы модели данных (Power Pivot). Вы можете настроить некоторые таблицы PQ в виде таблиц, загружаемых в DM, поэтому данные будут «переноситься» из PQ в DM только для этих конкретных таблиц.
Я почти уверен, что невозможно получить данные из таблиц «PQ only». Вы можете просто получить m запросов (не их результаты) через VBA или распаковав Excel.
Относительно таблиц PP (DM). На самом деле, в Excel есть движок Analytical Services (VertiPac) (на всякий случай - и внутри PowerBI Desktop). Поэтому, как только вы запускаете Excel или PBI, вы фактически запускаете также экземпляр движка AS. Данные в нем доступны через:
Excel VBA (Visual Basic для приложений). У вас есть API Thisworkbook.Model.DataModelConnection. *, И вы можете получить доступ как к самим данным, так и к модели. Это единственный «официальный» способ получения данных программным способом.
Power Query - как источник данных Analytical Services. Это неофициальный способ, но я читал, что Microsoft сказала, что не собирается закрывать его в будущем (но вы никогда не знаете :-)). Например. Dax Studio может это сделать - https://www.sqlbi.com/tools/dax-studio/ . К сожалению, хотя добраться до службы PBI AS довольно просто, я не знаю, как добраться до службы Excel AS без Dax Studio. Насколько я понимаю, основная проблема заключается в том, как получить номер порта AS, запущенного в Excel. Но я надеюсь, что эта информация, по крайней мере, поможет вам понять путь для дальнейшего поиска, если вы хотите пойти по пути Power Query. Или может быть целесообразно использовать Power BI Desktop для этой задачи.
Excel - это просто zip-файл, поэтому определенно AS-файлы находятся внутри него. Я никогда не шел этим путем, но вы можете наблюдать, что находится внутри exel zip - возможно, файлы AS могут быть там в какой-то полезной форме.
Это зависит от TypeA
и TypeB
.
null
кому: TypeB
потому что это - тип значения, но TypeA
ссылочный тип), затем, вызов будет выполнен к применимому.TypeA
и TypeB
. TypeA
кому: TypeB
но никакое неявное преобразование из TypeB
кому: TypeA
затем использование перегрузки TypeA
будет использоваться.TypeB
кому: TypeA
но никакое неявное преобразование из TypeA
кому: TypeB
затем использование перегрузки TypeB
будет использоваться.Посмотрите раздел 7.4.3.4 из спецификации C# 3.0 для подробных правил.
Вот является пример его не быть неоднозначным. Здесь TypeB
происходит из TypeA
, что означает, что существует неявное преобразование из TypeB
кому: TypeA
, но не наоборот. Таким образом использование перегрузки TypeB
используется:
using System;
class TypeA {}
class TypeB : TypeA {}
class Program
{
static void Foo(TypeA x)
{
Console.WriteLine("Foo(TypeA)");
}
static void Foo(TypeB x)
{
Console.WriteLine("Foo(TypeB)");
}
static void Main()
{
Foo(null); // Prints Foo(TypeB)
}
}
В целом, даже перед лицом иначе неоднозначного вызова, чтобы гарантировать, что конкретная перегрузка используется, просто бросьте:
Foo((TypeA) null);
или
Foo((TypeB) null);
Обратите внимание, что, если это вовлекает наследование в классы объявления (т.е. один класс перегружает метод, объявленный его базовым классом) Вы в целую другую проблему, и необходимо бросить цель метода, а не аргумента.
Jon Skeet дал всесторонний ответ, но с точки зрения дизайна Вы не должны зависеть от угловых случаев спецификации компилятора. Если ничто иное, если необходимо искать то, что это делает перед записью этого, следующий человек, который попытается считать его, не будет знать то, что это делает также. Это не удобно в сопровождении.
Перегрузки там для удобства, и две различных перегрузки с тем же именем должны сделать то же самое. Если эти два метода делают разные вещи, переименуйте один или они оба.
Это более обычно для перегруженного метода иметь варианты с переменными числами параметров, и для перегрузки с меньшим количеством параметров для предоставления разумных значений по умолчанию.
например. string ToString(string format, System.IFormatProvider provider)
имеет большинство параметров,
string ToString(System.IFormatProvider provider)
предоставляет формат по умолчанию, и
string ToString()
предоставляет формат по умолчанию и поставщика,
неоднозначный вызов. (ошибка времени компиляции).