Action
и передавать в Control.Invoke()
формы. Пример IQuerable
в частности. С помощью этого интерфейса и LINQ вы сможете формировать запросы (которые рендерятся в нативный SQL), а не просто фильтровать коллекции.private IQuerable<Student> GetLogs()
{
return context.Logs;
}
public IEnumerable<Student> GetLogsForStudent(int id, DateTime from, DateTime to)
{
return GetLogs().Where(x => x.Id == id
&& x.Date >= from
&& x.Date <= to)
.ToList();
}
Все используют lazy loading?
Если мне нужен в 1 контроллере/сервисе не 1 репозиторий? мне по 1 их подключать?
Изачем он для юнит тестов если можно спокойно moqнуть весь dbcontext?
dbcontext
мокать нет смысла хотя бы потому, что он гвоздями к EF прибит. СУБД менять - это не такая распространенная практика, а вот от ORM (и от EF в частности) отказываться в пользу производительности - это реальный кейс с ростом нагрузки. A
в B
нельзя, потому что A - это не B. Потому что B
содержит какое-то дополнительное состояние (b
), которого нет в A
и компилятору неизвестно, каким оно должно быть в текущем виде (A
конструировался иначе, чем B
и как получить валидный B
из A
- известно лишь программисту). Invalid Cast
).Enumerable.OfType<T>()
- фильтрует по типу и законно возвращает пустой список (у вас список A
, там действительно нет B
)Enumerable.Cast<T>()
- последовательно делает каст, который невозможен.listA.Select(x => new B{ a = x.a }).ToList();
A
необходимые данные для конструирования объекта B
. Важно понимать, что это будут именно ДРУГИЕ объекты. Если A некопируем по своей природе, то этот фокус не пройдет. // Каждая локаль должна иметь в себе словарь с переводами
public interface class ILocale {
Dictionary<string, string> Translation { get; }
}
// реализации разных локалей
public class English : ILocale {
public Dictionary<string, string> Translation {get; set;} = new Dictionary<string, string> {
["test"] = "Test"
};
}
public class Russian : ILocale {
public Dictionary<string, string> Translation {get; set;} = new Dictionary<string, string> {
["test"] = "Тест"
};
}
public class Ukrainian : ILocale {
public Dictionary<string, string> Translation {get; set;} = new Dictionary<string, string> {
["test"] = "Тест"
};
}
public class Kazakh : ILocale{
public Dictionary<string, string> Translation {get; set;} = new Dictionary<string, string> {
["test"] = "Сынақ"
};
}
namespace TestLib{
class Program {
static void Main(string[] args) {
ILocale locale = GetLocale();
WriteLine(locale.Translation["test"]);
ReadKey();
}
}
private static ILocale GetLocale() {
// Мы можем получать ее динамически из конфига
// но вызывающий код знает лишь, что это будет некая локаль, но какая
// точно - неизвестно
return Configuration.GetLocaleFromXml(); // псевдокод
}
}
For UPDATE, INSERT, and DELETE statements, the return value is the number of rows affected by the command.When a trigger exists on a table being inserted or updated, the return value includes the number of rows affected by both the insert or update operation and the number of rows affected by the trigger or triggers.For all other types of statements, the return value is -1.If a rollback occurs, the return value is also -1.
private static List<SomeType> ReadFromFile(string path) {
if (path == null) {
throw new ArgumentNullException("path");
}
if (File.Exists(path)) {
string file = File.ReadAllText(path);
...
} else {
throw new FileNotFoundException(path);
}
}
private void doTheBestBtn_Click(object sender, EventArgs e)
{
try {
var myList = ReadFromFile(txtInput.Text);
...
}
catch(ArgumentNullException ex) {
MessageBox.Show("Необходимо указать путь к файлу!");
}
catch(FileNotFoundException ex) {
MessageBox.Show("Указанный файл не найден!");
}
}