2015-12-09 3 views
0

Есть ли способ в LINQ преобразовать этот следующий код sql?Sql ExecuteSqlCommand LINQ

public Category SaveCategory(Category category, string tableName) 
{ 

    var context = new MyEntities(); 

    context.Database.ExecuteSqlCommand("INSERT INTO " + tableName + " (title,description) VALUES {0}{1} ", table.title, table.description); 

}

Я хочу, чтобы избежать использования условий, как «если» и «переключатель случай», как:

case "Country": tableName= db.Countries.FirstOrDefault(x => x.id == id); 
     break; 
case "City": tableName= db.Cities.FirstOrDefault(x => x.id == id); 
     break; 

... 
return tableName 
+0

Какой тип 'db' происходит? Я предполагаю, что это «DbContext», как [этот пример] (http://www.entityframeworktutorial.net/EntityFramework4.3/dbcontext-vs-objectcontext.aspx). –

ответ

1

Если вы можете использовать Type с вместо string ами, может использовать Set method of the DbContext.

Type tableType = // type representing Country 
DbSet mySet = db.Set(tableType); 
mySet.Add(whatever); 

Или вы можете получить доступ к Database property, но ваш код потенциально открыт для SQL инъекций. Вы должны проверить строку на белый список допустимых имен таблиц или сделать что-то еще, чтобы удалить возможность инъекции.

db.Database.ExecuteSqlCommand(...); 
+0

Если я использую db.Database, я не буду получать объекты в случае SELECT. – user708683

+0

О, так что вы пытаетесь сделать это в большем количестве случаев, чем просто INSERT. Если большая часть вашего кода похожа на пример INSERT, где у вас есть такая же простая структура (id, title, description), возможно, у вас должна быть таблица для «Categories» и перечисление, в котором говорится, является ли категория «Страна», «Город», и т. д. вместо отдельной таблицы для каждого. Как бы то ни было, похоже, что вы пытаетесь установить круглую привязку в квадратном отверстии, используя LINQ, как строковые SQL-запросы (потому что у вас плохой дизайн от DB-to-model). –

+0

Я предпочитаю иметь отдельную таблицу, а затем получать данные из одной таблицы за раз, зная, что я всегда буду использовать одну таблицу, а не две или больше. Если я создам таблицу Category, которая отображает все мои таблицы Country, City, я получаю огромную таблицу с тысячами данных, плюс у меня будет другая таблица позже с той же структурой. Так зачем приносить всю Европу, чтобы получить Италию, если я знаю, что я просто хочу поехать в Италию;) db.Database.ExecuteSqlCommand (...) - хорошее решение для меня. Чтобы избежать SQL Injection, я буду использовать что-то наподобие: VALUES {0} {1} ", table.title, table.description. Спасибо за помощь. – user708683

Смежные вопросы