ExecuteStoreQuery с «анонимным» параметром с табличным значением

#sql #sql-server #entity-framework #relational-database

Вопрос:

Я пытаюсь выполнить ObjectContext.ExecuteStoreQuery с помощью таблично значимого параметра SQL

 var data = new DataTable();
data.Columns.Add("NAME1", typeof(int));
data.Columns.Add("NAME2", typeof(int));

... add rows to the data table

SqlParameter param = new SqlParameter()
{
    ParameterName = "@pairs",
    Value = data,
    SqlDbType = SqlDbType.Structured
};
ObjectContext.ExecuteStoreQuery<long>(
                "select ID"  
                "from TEST t join @pairs p "  
                "on t.NAME1 = p.NAME1 and t.NAME2= p.NAME2"
)

 

Выполнение завершается с этой ошибкой:

Система.Исключение ArgumentException: «Параметр типа таблицы» @пары «должен иметь допустимое имя типа».

насколько я понимаю, я не указал имя типа, потому что это не существующий тип таблицы в базе данных. Итак, нет ли способа передать список каких-либо непримитивных параметров в запрос? или я что-то упускаю?

Любые альтернативные решения, использующие ObjectSet/Queryable вместо собственного запроса, будут приняты.

Комментарии:

1. Почти уверен, что нет другого способа сделать это, кроме как создать тип таблицы в базе данных — есть ли причина не делать этого? Некоторые люди используют подход создания строк, разделенных запятыми, и т. Д., А затем их разделения-не рекомендуется, потому что это может привести ко всевозможным проблемам, — но иногда может решить текущую проблему.

2. @ДалеК без причины.. Я могу создать его, просто мне это кажется ненужным.. Поскольку в SQL вы можете легко достичь этого на лету, используя временную таблицу или with предложение — без предварительного определения таблицы. Немного удивительно, что нет никаких функций для создания запросов такого типа. Я считаю, что это было бы довольно легко осуществить..