实体框架 - 无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型

Posted

技术标签:

【中文标题】实体框架 - 无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型【英文标题】:Entity Framework - Cannot convert lambda expression to type 'string' because it is not a delegate type 【发布时间】: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;这修复了错误。 【参考方案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

【讨论】:

以上是关于实体框架 - 无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型的主要内容,如果未能解决你的问题,请参考以下文章

获取 java.lang.ClassCastException:使用 FlatMap 时无法将类 lambda.Student 强制转换为类 java.lang.Comparable

查询 (LINQ) 表达式无法转换为实体框架核心

我可以将实体框架上下文保留为类变量吗?

如何“不是”实体框架的 lambda 表达式

实体框架在执行 lambda 表达式时抛出错误

如果不首先将 lambda 表达式转换为委托或表达式树类型,则无法将 lambda 表达式用作动态分派操作的参数