#c# #asp.net #linq-to-sql #3-tier
#c# #asp.net #linq-to-sql #3-уровневый
Вопрос:
всем привет, у меня проблема с моим 3-уровневым приложением, я не знаю, как получить данные из нескольких таблиц, используя linq2sql в приложении с 3-уровневой архитектурой, вот код каждого уровня
GestionProjetCommon Project
Клиентский класс :
public class Client
{
private int _ID;
public int ID
{
get { return _ID; }
set { _ID = value; }
}
private string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
}
Класс проекта :
public class Projet
{
private int _ID;
public int ID
{
get { return _ID; }
set { _ID = value; }
}
private string _Title;
public string Title {
get { return _Title; }
set { _Title= value; }
}
private int _IDClient;
public int IDClient
{
get { return _IDClient; }
set { _IDClient = value; }
}
}
GestionProjetDAL Project
Класс GestionProjetDA :
public class GestionProjetDA
{
private GestionProjetDADataContext db = new GestionProjetDADataContext();
public List<GestionProjet.Client> GetClients() //This Works Fine No Problem !
{
var req = from clt in db.Clients select c<
List<GestionProjet.Client> clientList = new List<GestionProjet.Client>();
foreach (Clients item in req)
{
clientList.Add(new GestionProjet.Client() { ID = item.ID, Nom = item.Nom });
}
return clientList;
}
public List<GestionProjet.Client> GetProjectClient()
{
var req = from prj in db.Projets
from clt in db.Clients
where clt.ID == prj.IDClient
select new
{
Name=clt.Name,
Projet = prj.Title,
};
List<GestionProjet.Client> clientProjectList = new List<GestionProjet.Client>();
foreach (var clt in req)
{
//I Don't know what to do in here and get the Data From both of the Tables
}
}
}
Gestionprojetбизнес-проект
Класс GestionProjetB :
public class GestionProjetB
{
private GestionProjetDAL.GestionProjetDA GPDA = new GestionProjetDAL.GestionProjetDA();
public List<Client> GetClients()
{
return GPDA.GetClients();
}
//Here i Should put the 2nd Method
}
Ну, как вы можете видеть, у меня нет проблем с получением данных из одной таблицы, но единственная проблема заключается в получении их из нескольких таблиц.
я искал решение всю ночь, но я не нашел его, пожалуйста, помогите мне, спасибо
Комментарии:
1. не должен ли ваш метод
GetProjectClient
получать идентификатор проекта в качестве входных данных, т. Е. возвращать клиентов конкретного проекта?2. нет, я должен объединить все имена клиентов и их проекты, что-то вроде SELECT * ИЗ клиентов C, Project P, ГДЕ C.ID = P.idClient
Ответ №1:
Создайте класс DTO, что-то вроде:
public class ClientDTO
{
public int ID { get; set; }
public string Name { get; set; }
public string ProjectName { get; set; }
}
теперь напишите хорошее выражение linq для заполнения класса DTO:
public List<GestionProjet.Client> GetProjectClient()
{
return (from prj in db.Projets
join clt in db.Clients on prj.IDClient equals clt.ID
select new ClientDTO
{
Name = clt.Name,
ProjetName = prj.Title,
ID = clt.ID
}).ToList();
}
Надеюсь, я правильно понял вашу проблему и прошу прощения за то, что не протестировал код перед публикацией.
Комментарии:
1. спасибо Maziar за вашу помощь, но я уже думал об этом, это непрактично представьте, что у меня около 6 таблиц, и эти таблицы имеют более 15 отношений, так правильно ли создавать класс DTO для каждого отношения?
2. это отлично работает @Maziar Taheri большое спасибо, но скажите мне, что, если бы у меня было много таблиц с несколькими отношениями?
3. пожалуйста, на самом деле объекты DTO должны быть определены настолько полно, насколько этого требует контекст, например, ваш класс DTO может содержать список другого класса DTO. но для повышения эффективности этот список может быть заполнен большинством ваших методов DAL и оставаться пустым. один конкретный метод вернул бы объекты DTO с заполненным списком.
4. В конце концов, вы, возможно, знаете, что классы таблиц LINQ имеют отношение к связанным таблицам, но использование этих отношений в некоторых случаях может быть неэффективным, а с другой стороны, это не очень хорошая 3-уровневая модель.
5. «например, ваш класс DTO может содержать список другого класса DTO. но для повышения эффективности этот список может быть заполнен большинством ваших методов DAL и оставаться пустым » Пример, пожалуйста!? фрагмент кода!