Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Asp.net mvc 3 如何用foreach更好地编写此LINQ_Asp.net Mvc 3_C# 4.0_Linq To Entities - Fatal编程技术网

Asp.net mvc 3 如何用foreach更好地编写此LINQ

Asp.net mvc 3 如何用foreach更好地编写此LINQ,asp.net-mvc-3,c#-4.0,linq-to-entities,Asp.net Mvc 3,C# 4.0,Linq To Entities,我在用实体框架进行MVC3项目。我对foreach有一个LINQ查询。一切都很好。但当数据量增加时,我就面临性能问题。我对林克没有多少经验。所以我无法解决我的问题。请看一下我的代码,并为我提供更好的建议 代码 List<int> RouteIds = db.Cap.Where(asd => asd.Type == 3).Select(asd => asd.UserId).ToList(); var UsersWithRoutingId =

我在用实体框架进行MVC3项目。我对foreach有一个LINQ查询。一切都很好。但当数据量增加时,我就面临性能问题。我对林克没有多少经验。所以我无法解决我的问题。请看一下我的代码,并为我提供更好的建议

代码

        List<int> RouteIds = db.Cap.Where(asd => asd.Type == 3).Select(asd => asd.UserId).ToList();

        var UsersWithRoutingId = (from route in db.RoutingListMembers
                                  where RouteIds.Contains(route.RoutingListId.Value) && route.User.UserDeptId == Id
                                  select
                                      new RoutingWithUser
                                      {
                                          UserId = route.UserId,
                                          RoutingId = route.RoutingListId
                                      });

        var ListRouteValue = (from cap in db.CareAllocationPercents
                              where cap.Type == 3
                              select new UserWithDeptId
                              {
                                  Year = (from amt in db.CareAllocations where amt.CareItemId == cap.CareItemId select amt.Year).FirstOrDefault(),
                                  UserId = cap.UserId,
                                  UserDeptId = (from userdept in db.Users where userdept.Id == cap.UserId select userdept.UserDeptId).FirstOrDefault(),

                              });

        List<UserWithDeptId> NewRouteList = new List<UserWithDeptId>();
        ListRouteValue = ListRouteValue.Where(asd => asd.Year == Year);

        foreach (var listdept in ListRouteValue)
        {
            foreach (var users in UsersWithRoutingId)
            {
                if (users.RoutingId == listdept.UserId)
                {
                    UserWithDeptId UserwithRouteObj = new UserWithDeptId();
                    UserwithRouteObj.UserId = users.UserId;
                    UserwithRouteObj.Year = listdept.Year;
                    UserwithRouteObj.UserDeptId = db.Users.Where(asd => asd.Id == users.UserId).Select(asd => asd.UserDeptId).FirstOrDefault();

                    NewRouteList.Add(UserwithRouteObj);
                }
            }
        }
        NewRouteList = NewRouteList.Where(asd => asd.UserDeptId == Id).ToList();
List RouteIds=db.Cap.Where(asd=>asd.Type==3);
var UsersWithRoutingId=(来自db.RoutingListMembers中的路由
其中RouteIds.Contains(route.RoutingListId.Value)和&route.User.UserDeptId==Id
选择
新路由与用户
{
UserId=route.UserId,
RoutingId=route.RoutingListId
});
var ListRouteValue=(来自db.CareAllocationPercents中的cap
其中cap.Type==3
选择新用户WithDeptid
{
年份=(从db.careeAllocations中的金额,其中amt.careeItemId==cap.careeItemId选择amt.Year)。FirstOrDefault(),
UserId=cap.UserId,
UserDeptId=(从db.Users中的userdept开始,其中userdept.Id==cap.UserId选择userdept.UserDeptId)。FirstOrDefault(),
});
List NewRouteList=新列表();
ListRouteValue=ListRouteValue.Where(asd=>asd.Year==Year);
foreach(ListRouteValue中的var listdept)
{
foreach(UsersWithRoutingId中的var用户)
{
if(users.RoutingId==listdept.UserId)
{
UserWithDeptId UserwithRouteObj=新用户withdeptid();
UserwithRouteObj.UserId=users.UserId;
UserwithRouteObj.Year=列表部门年份;
UserwithRouteObj.UserDeptId=db.Users.Where(asd=>asd.Id==Users.UserId)。选择(asd=>asd.UserDeptId.FirstOrDefault();
添加(UserwithRouteObj);
}
}
}
NewRouteList=NewRouteList.Where(asd=>asd.UserDeptId==Id.ToList();

谢谢,

您必须在第一个语句中使用join。如何做到这一点的示例如下:

我有一些想法要告诉你: 第一: 注意在linq查询中完成where-close,以获得所需的内容。 使用Linq on集合,可以删除一个foreach循环。我不知道结局,但我试着给你写点东西:

var UsersWithRoutingId = (from route in db.RoutingListMembers
                                      where RouteIds.Contains(route.RoutingListId.Value) && route.User.UserDeptId == Id
                                      select
                                          new RoutingWithUser
                                          {
                                              UserId = route.UserId,
                                              RoutingId = route.RoutingListId
                                          });

            var ListRouteValue = (from cap in db.CareAllocationPercents
                                  where cap.Type == 3
                                  select new UserWithDeptId
                                  {
                                      Year = (from amt in db.CareAllocations 
                                              where amt.CareItemId == cap.CareItemId && amt.Year == Year
                                              select amt.Year).FirstOrDefault(),
                                      UserId = cap.UserId,
                                      UserDeptId = (from userdept in db.Users 
                                                    where userdept.Id == cap.UserId && userdept.UserDeptId == Id  
                                                    select userdept.UserDeptId).FirstOrDefault(),

                                  });
List<UserWithDeptId> NewRouteList = new List<UserWithDeptId>();

            foreach (var listdept in ListRouteValue)
            {

                var user = UsersWithRoutingId.Where(uwri => uwri.RoutingId == listdept.UserId).FirstOrDefault();
                if (user != null)
                {
                    NewRouteList.Add(new UserWithDeptId { UserId=user.UserId, Year=listdept.Year, UserDeptId=listdept.UserDeptId  });
                }
            }

            return NewRouteList
var userswithroutinggid=(来自db.RoutingListMembers中的路由
其中RouteIds.Contains(route.RoutingListId.Value)和&route.User.UserDeptId==Id
选择
新路由与用户
{
UserId=route.UserId,
RoutingId=route.RoutingListId
});
var ListRouteValue=(来自db.CareAllocationPercents中的cap
其中cap.Type==3
选择新用户WithDeptid
{
年份=(以db.1为单位的金额)
其中amt.CareItemId==cap.CareItemId&&amt.Year==Year
选择金额年份)。FirstOrDefault(),
UserId=cap.UserId,
UserDeptId=(来自数据库Users中的userdept
其中userdept.Id==cap.UserId&&userdept.UserDeptId==Id
选择userdept.UserDeptId).FirstOrDefault(),
});
List NewRouteList=新列表();
foreach(ListRouteValue中的var listdept)
{
var user=UsersWithRoutingId.Where(uwri=>uwri.RoutingId==listdept.UserId).FirstOrDefault();
如果(用户!=null)
{
NewRouteList.Add(new UserWithDeptId{UserId=user.UserId,Year=listdept.Year,UserDeptId=listdept.UserDeptId});
}
}
返回新路线列表
这对你合适吗? (我不轮询db.user表,假设listdept中的表是好的,那么就为NewRouteList获取UserDeptId)

第二: 注意实体数据加载,如果您有带外键的表,如果不需要同时加载表的子级,请注意删除延迟加载。想象外键指向其他表的多个表的增益。 编辑: 这里有一个链接可以解释这一点: