David_Wimbley
Какое-то время я думал о том, чтобы сделать краткое руководство для XPO, поскольку я прошел через то же самое, что и вы. Документация DevExpress хороша, но это тонна информации, которую нужно просеять. На самом деле нет никакого краткого руководства по XPO per-say...может быть, я наконец напишу свою первую статью.
Я собираюсь сделать здесь несколько предположений, например, что вы используете sql server в качестве своего бэкэнда.
Одна вещь, которую следует иметь в виду, если вы делаете это/когда-нибудь начнете использовать XPO с веб-приложениями, вы хотите убедиться, что каждый вызов, который вы делаете с помощью XPO, обернут в using(var uow = new UnitOfWork (), иначе вы получите некоторые неприятные ошибки перекрестной потоковой передачи.
Я использую "YourClassName" в своих примерах. Это будут ваши объекты XPO,которые вы либо создадите с помощью мастера DevExpress ORM, либо создадите вручную.
Если у вас есть еще какие-либо вопросы о xpo, не стесняйтесь обращаться ко мне.
//Initialize your data layer.
//By default if you don't do this, XPO will try and use an access databse (jet)
Session session = new Session();
XpoDefault.DataLayer = XpoDefault.GetDataLayer(MSSqlConnectionProvider.GetConnectionString("YourServerHostnameOrIP", "DB Username", "DB Password", "DB Name"), AutoCreateOption.None);
XpoDefault.Session = session;
//Equivalent of SELECT * FROM TableName in SQL
// YourClassName would be your XPO object (your persistent object)
using (var uow = new UnitOfWork())
{
XPCollection<yourclassname> getRecords = new XPCollection<yourclassname>(uow);
foreach (var item in getRecords)
{
//Do something with what you got in your XPCollection
}
}
//Equivalent of SELECT * FROM TableName WHERE Id = 1
using (var uow = new UnitOfWork())
{
XPCollection<yourclassname> getSpecificRecord = new XPCollection<yourclassname>(uow, CriteriaOperator.Parse("Id = '1'"));
//OR
YourClassName getSingleRec =
new XPCollection<yourclassname>(uow, CriteriaOperator.Parse("Id = '1'")).FirstOrDefault();
//do something with single record from DB
}
//Equivalent of SELECT * FROM Table WHERE FileName LIKE '%User%'
using (var uow = new UnitOfWork())
{
XPCollection<yourclassname> getRecords = new XPCollection<yourclassname>(uow, CriteriaOperator.Parse("FileName LIKE '%user%'"));
foreach (var item in getRecords)
{
//do something with code
}
}
//Equivalent of an Insert Statement in SQL
using (var uow = new UnitOfWork())
{
YourClassName save = new YourClassName(uow);
save.FieldName = "I am a value to save to Database";
save.Save();
uow.CommitChanges();
//.Save() will persistent your changes to the object but uow.CommitChanges() will save those changes back to the database
}
//Equivalent of an Update statement in SQL
using (var uow = new UnitOfWork())
{
YourClassName update = uow.FindObject<yourclassname>(CriteriaOperator.Parse("Id = '1'"));
update.FieldName = "Update To New Value";
update.Save();
uow.CommitChanges();
}
</yourclassname></yourclassname></yourclassname></yourclassname></yourclassname></yourclassname></yourclassname></yourclassname>
Uzoma Umekwe
David_Wimbley ваш учебник был действительно полезен. Моя уверенность в использовании XPO постепенно растет.Всякий раз, когда мне понадобится прикосновение профессионала к моему коду, я всегда буду кричать вам. :) Большое спасибо.
David_Wimbley
Вы можете просто загрузить две таблицы в XPCollections, а затем с помощью linq выполнить соединение таким образом.
Другой вариант-прямой sql-запрос с использованием XPO.
Но есть способ сделать это, который, скорее всего, хорошо документирован на досках объявлений и форумах devexpress.
David_Wimbley
Я не знаком с XAF, и когда я ответил, что это был последний раз, когда я действительно использовал XPO...я перешел на entity framework, так что, боюсь, я не смогу вам сильно помочь.
Есть ли у вас код в XAF, которым вы можете поделиться? Я уверен, что если вы можете получить доступ к коду, вы можете массировать ответ в свой код XAF.