实体框架 - 无法将lambda表达式转换为类型'string',因为它不是委托类型

时间:2010-01-13 16:45:36

标签: c# .net entity-framework lambda

我在基于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表达式转换为'string'类型,因为它不是委托类型

任何想法会导致什么?

14 个答案:

答案 0 :(得分:111)

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

using System.Linq;

这解决了它。

答案 1 :(得分:94)

在我的情况下它缺少

using System.Data.Entity;

答案 2 :(得分:9)

using System.Linq;
using System.Data.Entity;

答案 3 :(得分:7)

就我而言,我有

Using System.Linq;

但我错过了&amp;&amp;在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

我希望能节省一些时间。

答案 4 :(得分: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”的案例错了!我希望这可以帮助别人。您可能因为放置了一个不存在的属性而收到此错误!

答案 5 :(得分:2)

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

答案 6 :(得分:1)

我有同样的问题与mvc 3 razor也许有人有相同所以我想展示如何在我的stuation中解决它

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

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

答案 7 :(得分:1)

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

原文:IQueryable test = from r in Records其中r.Record_ID == 100选择r;

其中Records是由先前LINQ expresson产生的IQueryable。

修复方法是在表达式中投射记录:(IQueryable&lt; record&gt;)记录。找到它之后,它就变得非常有意义了。记录未输入,因此如果r.Record_ID有效,则LINQ不知道。混淆是错误信息,它出现在几十个地方的网络上,几乎在所有情况下解决方案都是缺少的两个使用条款中的一个。我发现这一两个不是一个使用问题,他们没有费心去发布修复它的内容。

希望这会有所帮助......

答案 8 :(得分:0)

我遇到类似的问题,将列绑定到Telerik MVC Grid。 我在ViewModel类上有一个Id属性。 (灵感来自Chris上面的答案)我将它重命名为XxxId,问题就消失了。我似乎记得MVC为Id属性做了一些特别的事情。

答案 9 :(得分:0)

我有一个类似的问题,但使用Rx,在我的情况下添加

using System;

帮助。 FWIW

对于那些缺少的扩展方法,有时候太烦人了。

答案 10 :(得分:0)

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

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

using SP = Microsoft.SharePoint.Client;

要修复,此外我还添加了它而没有命名空间:

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

答案 11 :(得分: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”。当我在所有模型变量上删除“静态”时,我不再收到错误。让我疯了大约一天......

答案 12 :(得分:0)

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

答案 13 :(得分:0)

对于 .Net Core ,只需进行介绍;

using System.Linq;
using Microsoft.EntityFrameworkCore;