实体框架 - 无法将 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 => 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 => 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
希望这会有所帮助...
【讨论】:
【参考方案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