【问题标题】:Entity Framework - Cannot convert lambda expression to type 'string' because it is not a delegate type实体框架 - 无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型
【发布时间】:2010-01-13 16:45:36
【问题描述】:

我在基于 C# 的代码中使用实体框架。我遇到了意想不到的怪事,正在寻找建议。

案例 1、2、3、4... 项目:
RivWorks.dll
RivWorks.Service.dll
RivWorks.Alpha.dll

示例(所有这些工作):
RivWorks.Alpha.dll:

public static bool EndNegotitation(long ProductID)
{
    var product = (from a in _dbFeed.AutoWithImage 
                   where a.AutoID == ProductID select a).FirstOrDefault();
...
}

RivWorks.Service.dll

public static RivWorks.Model.NegotiationAutos.AutoWithImage 
    GetProductById(long productId)
{
    var myProduct = from a in _dbFeed.AutoWithImage 
                    where a.AutoID == productId select a;

    return myProduct.FirstOrDefault();
}
public static List<RivWorks.Model.NegotiationAutos.AutoWithImage> 
    GetProductByCompany(Guid companyId)
{
    var myProduct = from a in _dbFeed.AutoWithImage 
                    where a.CompanyID == companyId select a;

    return myProduct.ToList();
}

案例“怪异”:
RivWorks.Web.Service.dll(WCF 项目)
包含与其他项目相同的引用。

public NegotiateSetup GetSetup(string method, string jsonInput)
{
    ...
    long.TryParse(ProductID, out result);
    var product = (from a in _dbFeed.AutoWithImage 
                   where a.AutoID == result select a).FirstOrDefault();
    ...
}

我收到此编译时错误(“where”一词在我的编辑器中突出显示):
无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型

有什么想法会导致这种情况吗?

【问题讨论】:

  • 这听起来很奇怪。如果您删除对FirstOrDefault 的调用,会发生什么情况?显然它会在你之后尝试使用product 时失败,但该语句是否编译?
  • 另外,如果你把它改成var product = _dbFeed.AutoWithImage.Where(a =&gt; a.AutoID == result); 会发生什么?让我们把查询表达式排除在外......
  • 所有这些例子都失败了。但是,我检查了所有代码片段中的 Using 语句,发现我缺少一个:Using System.Linq;这修复了错误。

标签: c# .net entity-framework lambda


【解决方案1】:

对于那些对结果感兴趣的人:
我的代码开头缺少一个简单的 Using 语句。

using System.Linq;

这就解决了。

【讨论】:

  • 我很惊讶 VS 和 ReSharper 都不够聪明,无法检测到这种情况。谢天谢地,SO 比两者都聪明。
  • 我得到了相同的错误消息,并且我使用 System.LINQ(并且“总是有”)。当然,模型成员之一将数据类型从 string[] 更改为 string...
【解决方案2】:

在我的情况下它丢失了

using System.Data.Entity;

【讨论】:

  • 我有“使用 System.Data.EntityClient;”而且,虽然它在那里,但它是灰色的/不必要的。不允许单独使用 System.Data.Entity(没有“客户端”)。
  • 你,米格尔爵士,是个天才。谢谢!
  • 太烦人了。即使我重新启动了 Visual Studio,也没有 IntelliSense 来救援。
【解决方案3】:
using System.Linq;
using System.Data.Entity;

【讨论】:

    【解决方案4】:

    在我的情况下,我有

    Using System.Linq;
    

    但我在 where 子句项后缺少 &&。

    错误代码:

    item.Group.ID == grp.ID
    p.Product_Status_Flag == 1 &&
    item.Valid
    

    正确的代码(没有错误):

    item.Group.ID == grp.ID && // <- This was missing and I didn't see it right away.
    p.Product_Status_Flag == 1 &&
    item.Valid
    

    我希望这可以节省一些时间。

    【讨论】:

      【解决方案5】:

      我在 Razor 视图中的 Telerik Grid 模板中为此苦苦挣扎了大约一个小时。就我而言,这是:

      columns.Bound(x => x.ID).Template(@<text><a href="@(Model.AppUrl + AdditionalFeeTypes/Details/" + item.ID)">@item.ID</a></text>);
      

      应该是这样的:

      columns.Bound(x => x.Id).Template(@<text><a href="@(Model.AppUrl + AdditionalFeeTypes/Details/" + item.Id)">@item.Id</a></text>);
      

      “Id”的案例是错误的!我希望这可以帮助别人。您可能会因为放置了不存在的属性而收到此错误!

      【讨论】:

        【解决方案6】:

        我偶然发现了这一点,并找到了不同的解决方法。我正在使用var query = context.Contacts.Where(c =&gt; c.FullNameReverse == "TingTong"); 并收到上述错误。错误是我使用方法FullNameReverse() 作为属性FullNameReverse。错过了()!!!

        【讨论】:

          【解决方案7】:

          我在使用 mvc 3 razor 时遇到了同样的问题,也许有人有同样的问题,所以我想展示如何在我的情况下解决它

          List<Taksit> lst = db.Taksit.Where(y => y.OgrenciId.Equals(Convert.ToInt32( list[0].Id))).ToList();
          

          我尝试使用 contains 但因此 OgrenciId 是 int 我得到了这里提到的错误,所以通过使用 equals 问题解决了

          【讨论】:

            【解决方案8】:

            线程有点老了,但我只是遇到了这个,网上没有任何答案。一个网站提到了导致答案的原因,这是一个数据类型问题,但遗憾的是我再也找不到它了,所以我在这里发布了我的解决方案。也许一些未来的搜索者会从中受益。

            原文:IQueryable test = from r in Records where r.Record_ID == 100 select r;

            其中 Records 是由先前的 LINQ 表达式产生的 IQueryable。

            解决方法是在表达式中强制转换 Records: (IQueryable)Records。找到它,它是完全有道理的。没有键入记录,因此 LINQ 不知道 r.Record_ID 是否有效。令人困惑的是错误消息,它出现在网络上几十个地方,几乎在每种情况下,解决方案都是缺少两个 using 子句之一。我发现的一两个不是使用问题,他们没有费心发布修复它的内容。

            希望这会有所帮助...

            【讨论】:

              【解决方案9】:

              我在将列绑定到 Telerik MVC 网格时遇到了类似的问题。 我的 ViewModel 类上有一个 Id 属性。 (受上面克里斯的回答启发)我将其重命名为 XxxId,问题就消失了。我似乎记得 MVC 为 Id 属性做了一些特殊的事情。

              【讨论】:

                【解决方案10】:

                我遇到了类似的问题,但使用 Rx 并且在我的情况下添加了

                using System;
                

                帮助。 FWIW

                有时把这些扩展方法弄得一团糟太烦人了。

                【讨论】:

                  【解决方案11】:

                  在我的情况下,我在 Sharepoint 2013 应用程序中尝试在 clientContext.Load 中使用 Include 时遇到此错误。

                  我已经像这样包含了 Sharepoint 客户端库:

                  using SP = Microsoft.SharePoint.Client;
                  

                  为了修复,另外我还添加了没有命名空间的:

                  using Microsoft.SharePoint.Client;
                  using SP = Microsoft.SharePoint.Client;
                  

                  【讨论】:

                    【解决方案12】:

                    我的问题涉及格式:

                    .Columns(columns => {
                        columns.Bound(p => p.Id).Filterable(false);
                        columns.Bound(p => p.Name).Width(250);
                        ...
                    

                    每个 p.Whatever 上都有这个错误。

                    这是一个使用 MVC 的项目,我发现我的问题是在我的模型中的这些变量(Id、Name 等)上有“public static int”或“public static string”。当我在所有模型变量上删除“静态”时,我不再收到错误。快把我逼疯了一天...

                    【讨论】:

                      【解决方案13】:

                      我在稍有不同的版本中遇到了这个问题。
                      如果您从 lambda 内部调用(静态)方法,请检查其返回类型。如果返回类型应该是 IEnumerable(在使用 lambdas 时通常是这样),但您返回的是对象,那么显然您遇到了问题。

                      【讨论】:

                        【解决方案14】:

                        试一试 使用 System.Linq; 我想它会帮助你解决这个问题。

                        【讨论】:

                          【解决方案15】:

                          对于.Net Core只需介绍一下;

                          using System.Linq;
                          using Microsoft.EntityFrameworkCore;
                          

                          【讨论】:

                            【解决方案16】:

                            我在一个非常独特的情况下得到了这个,但也许它会对某人有所帮助。我在 .NET Standard 2.0 应用程序中使用实体框架。为了逆向工程(首先是数据库)和搭建实体,您必须使用单独的虚拟项目。在虚拟项目中,我使用 Microsoft.EntityFrameworkCore[Tools/SqlServer/Design] 版本 5.09 Nuget 包,以便 Scaffold-DbContext 命令工作。问题是它会生成一个 DBContext 文件,其中包含导致引发此错误的代码。此版本的EntityFrameworkCore 与.NET Standard 2.0 不兼容,解决方案是使用兼容的3.1.18 版本。

                            【讨论】:

                              【解决方案17】:

                              如果您从在反向工程 EF 后生成的自动生成的数据库上下文类中遇到此问题,那么您必须检查您的 Microsoft.EntityFrameworkCore.SqlServer 版本。不支持某些版本entity.HasIndex()。更新你的 Nuget 包

                              • Microsoft.EntityFrameworkCore.SqlServer 到 5.0.8

                              • Microsoft.EntityFrameworkCore.Tools 到 5.0.8

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多