gpt4 book ai didi

c# - 重构 Linq to Sql

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:00 25 4
gpt4 key购买 nike

有没有办法重构 linq to sql 并利用后期评估?有没有办法重用对象启动器代码?

我的业务对象持久保存在数据库中,并通过单独的 linq to sql 层进行整合。

我希望能够重用来自执行完全相同操作的多个查询的代码。我想重用的查询部分是对象创建部分。我还想继续利用后期评估(只从数据库中获取我想要的列。)

下面给出的示例非常简单,为了保护无辜者,一些名称已更改。

示例 1

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;
}

示例 1 中发生了一些事情。在此示例中,我能够利用 linq to sql 后期评估。如果您查看数据库查询,唯一选择的列是我感兴趣的列(在 hydrateUser 中列为 ID、FirstName 等)。这很好,因为我可以重用 hydrateUser 中的代码。

示例 2:

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,
... Big long list of properties
};
return y;
}

IQueryable<User> hydrateUserWithPermissions(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,
... Big long list of properties
PermissionList = item.Permissions
};
return y;
}

当我想使用 hydrateUser 并水化关联对象时,示例 2 开始下降。例如,混合权限列表。我现在必须分拆出一个完整的独立功能来进行额外的水合作用。如果我要初始化的属性更多,那么这就不太理想了。

示例 3

IQueryable<User> hydratePermissions(IQueryable<LinqUser> x)
{
IQueryable<User> y;
y = from item in x
select new User
{
PermissionList = item.Permissions
};
return y;
}

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,
... Big long list of properties
};
return y;
}

我希望能够使用示例 3 中的代码构建查询。尝试以某种方式利用这两个函数。 并且只访问数据库一次。但是,这是行不通的。

示例 4

User newUpUserFromLinqUser(LinqUser item)
{
y = new User
{
ID = item.UserID,
FirstName = item.FirstName,
MiddleName = item.MiddleName,
LastName = item.LastName,
};
return y;
}

示例 4 接近我想要的,但丢失了 linq to sql 用于进行后期评估的表达式评估。所有字段都将在查询中返回。更糟糕的是,如果像这样的代码是一个子关系,则会为每个 child 调用数据库。这在我们的情况下是 Not Acceptable 。

补充说明

带宽非常宝贵。我们准确控制传输的数据,因此尽可能精简查询非常重要。

我看过LinqKit虽然它似乎可以满足我的需要,但我更喜欢“开箱即用”。

目前,整体架构尚无定论。

最佳答案

您是否研究过为您的用户显式加载权限对象?

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.
}

关于c# - 重构 Linq to Sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1460012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com