Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/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冗余数据库访问_C#_Asp.net Mvc 3_Linq To Sql - Fatal编程技术网

C# 相关型号的Linq冗余数据库访问

C# 相关型号的Linq冗余数据库访问,c#,asp.net-mvc-3,linq-to-sql,C#,Asp.net Mvc 3,Linq To Sql,为什么我的模型会再次转到数据库,以获取已经在单独的LINQ join语句中加载的相关属性 背景信息: ID|Client Name|Vertical ID| ___________________________ 1 |Client1 |2 | 2 |Client2 |5 | 3 |Client3 | | @foreach (var item in Model) { <tr> <td>

为什么我的模型会再次转到数据库,以获取已经在单独的LINQ join语句中加载的相关属性

背景信息:

ID|Client Name|Vertical ID|
___________________________
1 |Client1    |2          |
2 |Client2    |5          |
3 |Client3    |           |
@foreach (var item in Model) {
<tr>
    <td>
        @Html.Raw(item.client_name)
    </td>
    <td>
        @Html.Raw(item.getVerticalName())
    </td>
我最近在我的ASP.NET MVC3 Linq应用程序上运行了一些性能评测,我得到了一些我希望解决的令人困惑的结果

下面是db结构的简化版本。建立外键关系

表格客户端:

ID|Client Name|Vertical ID|
___________________________
1 |Client1    |2          |
2 |Client2    |5          |
3 |Client3    |           |
@foreach (var item in Model) {
<tr>
    <td>
        @Html.Raw(item.client_name)
    </td>
    <td>
        @Html.Raw(item.getVerticalName())
    </td>
表格垂直

ID|Vertical Name|
_________________
2 |Life         |
5 |Guilt        |
当我显示客户机列表时,我向他们显示客户机名称和垂直方向。我的控制器很简单:

public ActionResult Index()
    {
        ...
    var model = repository.GetAllClients();
        return View(model);
    }
Get all Client在垂直表上运行联接(以及其他一些)

问题:

ID|Client Name|Vertical ID|
___________________________
1 |Client1    |2          |
2 |Client2    |5          |
3 |Client3    |           |
@foreach (var item in Model) {
<tr>
    <td>
        @Html.Raw(item.client_name)
    </td>
    <td>
        @Html.Raw(item.getVerticalName())
    </td>
@foreach(模型中的变量项){
@Html.Raw(item.client\u名称)
@Html.Raw(item.getVerticalName())
我发现的问题是,即使我在原始模型中指定了连接(并且我已经能够在模型传递到视图之前验证垂直属性是否加载了值),每次我调用getVerticalName方法时,Linq都会自动再次转到db以加载垂直名称,这样我就可以访问垂直名称。这是非常低效的,因为我最终为每个客户端单独调用db,只是为了获取它们的垂直信息


我在这里遗漏了什么?LINQ难道不应该知道该属性已经绑定,而不是去db检索它,或者我需要指定一些东西来告诉LINQ我的信息已经存在于模型中吗?

我的第一印象是,让查询只执行一次,您应该更改:
返回客户机;
返回clients.ToList();


正如您的代码一样,我相信它返回的是一个
IQueryable
简单地转换为
IEnumerable
,并且根据设计,IQueryable将在其枚举的任何时候进入服务器。

不确定它在MVC中的行为,但可能您的问题是延迟加载相关实体。 您可以使用LoadOptions强制Linq-2-sql急切地加载

试一试

OperationsMetricsDataContext db=new OperationsMetricsDataContext();
DataLoadOptions dlo=新的DataLoadOptions();
dlo.LoadWith(c=>c.Vertical);
db.LoadOptions=dlo;

谢谢。延迟加载是问题所在。我曾尝试使用
ToList
尽早枚举和绑定,但这并没有解决问题。使用LINQ eager loading是关键。谢谢。是的,我不知道
DataLoadOptions
的设置和用法,所以知道在哪里可以使用它很好