Linq to sql 在Razor视图中使用System.Data.Linq

Linq to sql 在Razor视图中使用System.Data.Linq,linq-to-sql,asp.net-mvc-3,razor,Linq To Sql,Asp.net Mvc 3,Razor,我可能对这里发生的事情有一个基本的误解,但在我的razor视图中,我在LinqToSQL类中遇到了一个问题: <h3>Owners</h3> @foreach (var ThisOwner in Prop.PropertyOwnerships.Where(p=p.bIsOwner.Value==true)) { <div class="ODEditEntry"> ... 所有者 @foreach(Prop.PropertyOwnerships.Where中的

我可能对这里发生的事情有一个基本的误解,但在我的razor视图中,我在LinqToSQL类中遇到了一个问题:

<h3>Owners</h3>
@foreach (var ThisOwner in Prop.PropertyOwnerships.Where(p=p.bIsOwner.Value==true))
{
<div class="ODEditEntry">
...
所有者
@foreach(Prop.PropertyOwnerships.Where中的var ThisOwner(p=p.bIsOwner.Value==true))
{
...
我得到以下错误:

编译器错误消息:CS0012:未引用的程序集中定义了类型“System.Data.Linq.EntitySet'1”。必须添加对程序集“System.Data.Linq,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用

我尝试将@using System.Data.Linq放在cshtml文件的顶部,但它告诉我,在System.Data名称空间中不存在Linq。这显然不是真的,是的,我的项目中有System.Data.Linq作为引用


这里有什么想法吗?需要导入吗?我可以不在我的razor视图中使用Linq样式的东西吗?这似乎很奇怪?

您的Linq到Sql数据上下文是否存在于web项目之外(例如,在另一个类库中)?如果是这样的话,在您添加了对该项目的引用的地方,所有的构建都很好,但是在Razor视图中,您试图直接从
System.Data.Linq
程序集访问类型,而不在web项目中引用它。尝试将引用添加到主web项目,看看您得到了什么。

您需要添加对
Sys的引用tem.Data.Linq
在项目和/或
Web.config

中,您需要通过在视图顶部添加
@使用System.Data.Linq
将名称空间导入视图。但是,如果您希望在所有视图中都使用该名称空间,则需要将
添加到视图文件夹中的Web.config中:

  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Data.Linq" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>


虽然与您的问题无关,但您确实应该尝试将此逻辑移出视图并移入控制器,这将使调试变得更加容易,并意味着您的演示文稿与业务逻辑分离。

对我来说,解决方法是右键单击System.Data.Linq程序集引用,然后点击属性。在这里将Copy Local设置为true。

我花了好几个小时在谷歌上搜索,但没有找到有效的解决方案,但这对

删除web.config中
元素中的所有内容!

<compilation targetFramework="4.7.2">
  <assemblies>
    <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <!-- etc etc blah blah -->
  </assemblies>
</compilation>
解释


System.Linq命名空间是在System.Core中定义的,对吗?因此我们需要将其添加到
列表中,或者(因为System.Core总是在位于“%Windir%/Microsoft.NET/v4.0.30319/Framework/where”的根web.config中引用)删除
中的所有内容以防止冲突。

您可以在普通类中使用Linq吗?(只是为了确保)。@Using语句应该足够了。您是在本地运行此语句还是将其部署到另一台服务器?设置“复制本地”时是否也会出现此错误System.Data.Linq引用的属性为true?在我的控制器中正常工作。事实上,我当前的解决方法是:ViewBag.OwnerList=Prop.PropertyOwnerships.Where(p=>p.bIsOwner.Value==true)。ToList();这似乎…很奇怪。System.Data.Linq不应该在GAC中并具有通用访问权限吗?我在引用中有它。我将尝试将它添加到web.config的assemblies部分。它都在同一个项目中。在最后一句话中,您是说应该将Linq拉回到控制器中,而不是让控制器发送集合吗n已经过筛选?只是试图在我自己的代码中找到处理类似问题的最佳方法。是的,视图应该只关注数据的表示,并将逻辑、排序、排序等留给控制器。如果上述方法不起作用(添加到视图文件夹中的web.config),您还应该尝试将以下内容添加到主web.config文件中:
在system.web\compilation\assemblies中详细说明jao的答案,以下是您如何将其输入web.config:@AdamFlanagan我明白您关于将选择拉入控制器的观点,但排序/排序不是一个poi吗表示而非逻辑的nt?(只是好奇了解不同的透视图…)是的!!这是有效的。可能view.cshtml被编译为dll,但dll没有引用system.data.linq。为什么将system.data.linq复制到本地是可以的?
<compilation targetFramework="4.7.2"/>