我们决定在最近的项目中使用Linq to SQL作为数据层。我们有一个功能解决方案,到目前为止,它已经处理了我们在它上面抛出的所有东西,但有一个主要问题。我们必须一遍又一遍地编写相同的方法,以便从数据库中检索略有不同的结果集。
举个例子:
public List<TeamBE> GetTeamsBySolutionID(Guid SolutionID)
{
List<TeamBE> teams = new List<TeamBE>();
Esadmin db = new Esadmin(_connectionString);
var qry = (from teamsTable in db.Teams
join solutionsTable in db.Solutions on teamsTable.SolutionID equals solutionsTable.SolutionID
where teamsTable.SolutionID == SolutionID
select new { teamsTable, solutionsTable.SolutionName });
foreach (var result in qry)
{
TeamBE team = new TeamBE();
team.TeamID = result.teamsTable.TeamID;
team.Description = result.teamsTable.Description;
team.Status = result.teamsTable.Status;
team.LastModified = result.teamsTable.LastModified;
team.SolutionID = result.teamsTable.SolutionID;
team.SolutionName = result.SolutionName;
team.Name = result.teamsTable.Name;
team.LocationLevel = result.teamsTable.LocationLevel;
team.AORDriven = result.teamsTable.AoRDriven;
team.CriteriaID = result.teamsTable.CriteriaID ?? Guid.Empty;
teams.Add(team);
}
return teams;
}
public TeamBE GetTeamByID(Guid TeamID)
{
Esadmin db = new Esadmin(_connectionString);
TeamBE team = new TeamBE();
var qry = (from teamsTable in db.Teams
join solutionsTable in db.Solutions on teamsTable.SolutionID equals solutionsTable.SolutionID
where teamsTable.TeamID == TeamID
select new { teamsTable, solutionsTable.SolutionName }).Single();
team.TeamID = qry.teamsTable.TeamID;
team.Description = qry.teamsTable.Description;
team.Status = qry.teamsTable.Status;
team.LastModified = qry.teamsTable.LastModified;
team.SolutionID = qry.teamsTable.SolutionID;
team.SolutionName = qry.SolutionName;
team.Name = qry.teamsTable.Name;
team.LocationLevel = qry.teamsTable.LocationLevel;
team.AORDriven = qry.teamsTable.AoRDriven;
team.CriteriaID = qry.teamsTable.CriteriaID ?? Guid.Empty;
return team;
}不计其数的。
有没有一种方法可以将Linq结果作为参数传递给函数,这样我就可以将对象映射放在一个函数中,而不需要重复这么多?
发布于 2009-05-18 17:53:17
我很快就试了一下。可能不会编译(尤其是"from teamsTalbe in teams“),但是你可以分解出返回IQueryable<>的东西。虽然你的IQueryable返回了一个匿名类型,但这不会起作用。所以你可能需要创建一个显式类型来代替”select new { teamsTable,solutionsTable.SolutionName }“。
public List<TeamBE> GetTeamsBySolutionID(int solutionID)
{
Esadmin db = new Esadmin(_connectionString);
return GetTeamsBy(db, _GetTeamsBySolutionID(db, solutionID));
}
IQueryable<Team> _GetTeamsBySolutionID(Esadmin db, int solutionID)
{
return from teamsTable in db.Teams
where teamsTable.SolutionID == SolutionID
select teamsTable;
}
List<TeamBE> GetTeamsBy(Esadmin db, IQueryable<Team> teams)
{
List<TeamBE> teams = new List<TeamBE>();
var qry = (from teamsTable in teams
join solutionsTable in db.Solutions on teamsTable.SolutionID equals solutionsTable.SolutionID
select new { teamsTable, solutionsTable.SolutionName });
foreach (var result in qry)
{
TeamBE team = new TeamBE();
team.TeamID = result.teamsTable.TeamID;
team.Description = result.teamsTable.Description;
team.Status = result.teamsTable.Status;
team.LastModified = result.teamsTable.LastModified;
team.SolutionID = result.teamsTable.SolutionID;
team.SolutionName = result.SolutionName;
team.Name = result.teamsTable.Name;
team.LocationLevel = result.teamsTable.LocationLevel;
team.AORDriven = result.teamsTable.AoRDriven;
team.CriteriaID = result.teamsTable.CriteriaID ?? Guid.Empty;
teams.Add(team);
}
return teams;
}发布于 2009-05-18 17:46:45
我认为您可以将qry变量声明为IEnumerable<YourDataTypeEntity>并将其传递给一个方法。我倾向于将其作为一个构造函数来做:
class MyDataType
{
public MyDataType() {}
public MyDataType(MyDataTypeEntity mdte)
{
// set properties and fields here
}
// ...
}发布于 2009-05-18 17:52:32
你可以传递一个IQueryable,然后当你想要处理结果时,你可以迭代结果。我不确定这是你问的那种问题,还是我离你的问题太远了。
https://stackoverflow.com/questions/878909
复制相似问题