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


73

我在基于C#的代码中使用Entity Framework。我遇到了意外的怪异,正在寻找建议。

案例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);会发生什么呢?让我们从混合中取出查询表达式...
Jon Skeet 2010年

1
所有这些示例均失败。但是,我遍历了所有代码段中的Using语句,发现我缺少一个:Using System.Linq;。修复了错误。<sigh />
Keith Barrows 2010年

Answers:


114

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

using System.Linq;

这样就可以修复它。


16
我很惊讶VS和ReSharper都不足够聪明地检测到这种情况。幸运的是,SO比两者都聪明。
2011年

2
我得到了相同的err msg,并且使用了System.LINQ(并且“总是如此”)。当然,模型成员之一将数据类型从string []更改为string ...
B. Clay Shannon

102

就我而言,它不见了

using System.Data.Entity;


我曾“使用System.Data.EntityClient;” 而且,尽管它在那里,但它是灰色的/不必要的。不允许单独使用System.Data.Entity(不带“ Client”)。
B. Clay Shannon,

1
你,米格尔爵士,是个天才。谢谢!
oHoodie

很烦人。即使我重新启动了Visual Studio,也没有IntelliSense可以解救。
DankMemester'Andrew Servania'18-11-9


7

就我而言,

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

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


7

我在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”的情况是错误的!我希望这可以帮助别人。您可能只是因为放置了不存在的属性而收到此错误!


2

我偶然发现了这个问题,发现了另一个解决方法。我正在使用 var query = context.Contacts.Where(c => c.FullNameReverse == "TingTong");并遇到上述错误。错误是我将方法FullNameReverse()用作属性FullNameReverse。错过了()!!!


1

我用MVC 3剃须刀遇到了同样的问题,也许有人也有同样的想法,所以我想展示如何在我的状态下修复它

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

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


1

线程有点旧,但是我只是遇到了这个问题,网上的所有内容都不是答案。一个站点提到了导致问题答案的原因,这是一个数据类型问题,但是可惜我找不到它,因此我将解决方案发布在这里。也许将来有一些搜索者会从中受益。

原始值:IQueryable test =从Records中的r开始,其中r.Record_ID == 100选择r;

其中Records是从先前的LINQ Expresson得到的IQueryable。

解决方法是将Records:(IQueryable <record>)Records转换为表达式。找到它之后,它就非常有意义了。没有键入记录,因此LINQ不知道r.Record_ID是否有效。混乱是错误消息,它在整个网上遍布数十个地方,几乎在每种情况下,解决方案都是丢失的两个using子句之一。我发现不是使用问题的一两个问题,他们没有费心去发布解决问题的方法。

希望这可以帮助...


0

我在将列绑定到Telerik MVC网格时遇到了类似的问题。我在ViewModel类上有一个Id属性。(受到以上克里斯回答的启发),我将其重命名为XxxId,问题就消失了。我似乎想起了有关MVC对id属性进行特殊处理的一些事情。



0

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

我已经包括了Sharepoint客户端库,如下所示:

using SP = Microsoft.SharePoint.Client;

为了解决这个问题,我还添加了没有命名空间的功能:

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

0

我的问题涉及格式:

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

每一个p。无论有此错误。

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


0

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



0

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

using System.Linq;
using Microsoft.EntityFrameworkCore;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.