C# 将Linq重构为Sql
是否有办法将linq重构为sql并利用后期评估?有没有办法重用对象初始化器代码? 我将业务对象持久化到数据库中,并通过单独的linq到sql层进行水合 我希望能够重用多个查询中的代码,这些查询可以做完全相同的事情。我希望重用的查询部分是对象创建部分。我还想继续利用后期评估(只从数据库中获取我想要的列) 下面给出的例子非常简单,为了保护无辜者,一些名字已经更改 样本1C# 将Linq重构为Sql,c#,linq,linq-to-sql,refactoring,C#,Linq,Linq To Sql,Refactoring,是否有办法将linq重构为sql并利用后期评估?有没有办法重用对象初始化器代码? 我将业务对象持久化到数据库中,并通过单独的linq到sql层进行水合 我希望能够重用多个查询中的代码,这些查询可以做完全相同的事情。我希望重用的查询部分是对象创建部分。我还想继续利用后期评估(只从数据库中获取我想要的列) 下面给出的例子非常简单,为了保护无辜者,一些名字已经更改 样本1 void GetUserById(Guid userId) { IQueryable<LinqLayer.User&
void GetUserById(Guid userId)
{
IQueryable<LinqLayer.User> x =
from user in dataContext.Users
where user.UserID == userId
select user;
IQueryable<BusinessLayer.User> y = hydrateUser(x);
// Acutally execute the query against the database.
BusinessLayer.User user = y.First();
}
void GetUserByName(string name)
{
IQueryable<LinqUser> x =
from user in dataContext.Users
where user.FirstName == name
select user;
IQueryable<User> y = hydrateUser(x);
// Acutally execute the query against the database.
User user = y.First();
}
IQueryable<User> hydrateUser(IQueryable<LinqUser> x)
{
IQueryable<User> y;
y = from item in x
select new User
{
ID = item.UserID,
FirstName = item.FirstName,
MiddleName = item.MiddleName,
LastName = item.LastName,
};
return y;
}
示例4接近我想要的结果,但丢失了LINQtoSQL用于执行后期计算的表达式计算。查询中将返回所有字段。更糟糕的是,如果像这样的代码是子关系,则会为每个子关系调用数据库。这在我们的情况下是不能接受的
附加说明
带宽很昂贵。我们可以精确地控制数据,因此查询尽可能精简是非常重要的
我已经看过了,虽然它似乎可以满足我的需要,但我更喜欢“开箱即用”
在这个时候,整体架构还不值得讨论 您是否考虑过向用户显式加载权限对象
using (var db = new dbContext())
{
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<LinqUser>(lu => lu.Permissions);
db.LoadOptions = dlo;
//Execute code, knowing that when you retrieve users, it will also retrieve their permissions.
}
使用(var db=new dbContext())
{
DataLoadOptions dlo=新的DataLoadOptions();
LoadWith(lu=>lu.Permissions);
db.LoadOptions=dlo;
//执行代码,知道当您检索用户时,它也会检索他们的权限。
}
您是否考虑过向用户显式加载权限对象
using (var db = new dbContext())
{
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<LinqUser>(lu => lu.Permissions);
db.LoadOptions = dlo;
//Execute code, knowing that when you retrieve users, it will also retrieve their permissions.
}
使用(var db=new dbContext())
{
DataLoadOptions dlo=新的DataLoadOptions();
LoadWith(lu=>lu.Permissions);
db.LoadOptions=dlo;
//执行代码,知道当您检索用户时,它也会检索他们的权限。
}
我想了解一下您的示例3。那么,第一个方法是获取用户的权限集合,第二个方法是获取实际用户吗?为什么不将PermissionList=item.Permissions添加到第二个方法中?示例3实际上不起作用。然而,这是我想做的。基本上,我希望避免冗余代码。您提到的情况已在示例2中介绍。我认为我没有有效地沟通我的问题,因此我放弃这个问题。此外,我不相信我想做的是可能的。谢谢大家的帮助。我想了解一下你们的样品3。那么,第一个方法是获取用户的权限集合,第二个方法是获取实际用户吗?为什么不将PermissionList=item.Permissions添加到第二个方法中?示例3实际上不起作用。然而,这是我想做的。基本上,我希望避免冗余代码。您提到的情况已在示例2中介绍。我认为我没有有效地沟通我的问题,因此我放弃这个问题。此外,我不相信我想做的是可能的。谢谢大家的帮助。虽然这没有得到我想要的,但我会给你一个答案,因为你是唯一要回答的人。虽然这没有得到我想要的,但我会给你一个答案,因为你是唯一要回答的人。
User newUpUserFromLinqUser(LinqUser item)
{
y = new User
{
ID = item.UserID,
FirstName = item.FirstName,
MiddleName = item.MiddleName,
LastName = item.LastName,
};
return y;
}
using (var db = new dbContext())
{
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<LinqUser>(lu => lu.Permissions);
db.LoadOptions = dlo;
//Execute code, knowing that when you retrieve users, it will also retrieve their permissions.
}