Entity Framework - Невозможно преобразовать лямбда-выражение в тип 'string', потому что это не тип делегата - PullRequest
72 голосов
/ 13 января 2010

Я использую Entity Framework в своем коде на 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();
    ...
}

Я получаю эту ошибку времени компиляции (слово "где" выделено в моем редакторе):
Невозможно преобразовать лямбда-выражение в тип 'string', так как это не тип делегата

Есть идеи, что вызвало бы это?

Ответы [ 14 ]

111 голосов
/ 13 января 2010

Для тех, кто заинтересован в результате:
Мне не хватало простого оператора Using в начале моего кода.

using System.Linq;

Это исправило это.

95 голосов
/ 02 ноября 2012

В моем случае его не было

using System.Data.Entity;

9 голосов
/ 04 декабря 2015
using System.Linq;
using System.Data.Entity;
7 голосов
/ 05 января 2011

Я боролся с этим в шаблоне Telerik Grid в представлении Razor в течение часа. В моем случае это:

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" было неверным! Я надеюсь, что это помогает кому-то. Вы можете получить эту ошибку только потому, что вы указали несуществующее свойство!

7 голосов
/ 20 июля 2010

В моем случае у меня было

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

Надеюсь, это сэкономит кому-то время.

2 голосов
/ 22 сентября 2012

Я наткнулся на это и нашел другое исправление. Я использовал var query = context.Contacts.Where(c => c.FullNameReverse == "TingTong"); и получил упомянутую ошибку. Ошибка была в том, что я использовал метод FullNameReverse() как свойство FullNameReverse. Пропустил () !!!

1 голос
/ 08 июня 2018

Тема немного устарела, но я только что столкнулся с этим, и ничто в сети не было ответом. Один сайт упомянул, что привело к ответу, что было проблемой типа данных, но, к сожалению, я не могу найти это снова, поэтому я публикую свое решение здесь. Может быть, какой-нибудь будущий искатель извлечет из этого пользу.

Оригинал: IQueryable test = от r в записях, где r.Record_ID == 100 выберите r;

где Records - это IQueryable, полученный в результате предыдущего выражения LINQ.

Исправлено приведение записей: (IQueryable ) записей в выражении. Найдя это, это имеет смысл. Записи не напечатаны, поэтому LINQ не имеет ни малейшего представления, если r.Record_ID действителен. Путаница заключается в сообщении об ошибке, которое появляется по всей сети в десятках мест, почти во всех случаях решение является одним из двух отсутствующих предложений использования. Один или два, которые я нашел, не были проблемой использования, они не удосужились опубликовать, что это исправило.

Надеюсь, это поможет ...

1 голос
/ 09 февраля 2012

У меня была такая же проблема с бритвой mvc 3, может быть, у кого-то такая же, поэтому я хочу показать, как это исправить в моем стуации

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

Я пытался использовать содержит, но, следовательно, OgrenciId является int, я получаю ошибку, упомянутую здесь, поэтому с помощью равных проблема решена

0 голосов
/ 08 мая 2017

Просто попробуй использование System.Linq; Я думаю, что это поможет вам разобраться в этих проблемах.

0 голосов
/ 27 октября 2015

У меня была эта проблема в немного другой версии.
Если вы вызываете (статический) метод изнутри лямбды, проверьте его тип возвращаемого значения. Если возвращаемый тип должен быть IEnumerable (который часто имеет значение true при использовании лямбды), но вы возвращаете объект, очевидно, у вас есть проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...