Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Linq重构为Sql_C#_Linq_Linq To Sql_Refactoring - Fatal编程技术网

C# 将Linq重构为Sql

C# 将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&

是否有办法将linq重构为sql并利用后期评估?有没有办法重用对象初始化器代码?

我将业务对象持久化到数据库中,并通过单独的linq到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;
}
示例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.
}