2015-12-08 4 views
0

У меня есть метод WCF, где я соединяю между двумя таблицами. Теперь я столкнулся с этой ошибкой:NotSupportedException был пойман

LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression.

Когда я смотрел с точкой останова мои переменный я создаю в моей операции контракте показывает undefined При работе через кодирование.

Операция контракта

[OperationContract] 
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "getRepByCompA/{CompanyID}")] 
List<Represetative> GetRepByCompA(string CompanyID); 

Сервис Метод

public List<Represetative> GetRepByCompA(string CompanyID) 
    { 
     try 
     { 
      TruckDb db = new TruckDb(); 

      List<Represetative> RepList = new List<Represetative>(); 

      var join = from t in db.Companies 
        join p in db.Represetatives on t.Id equals p.CompanyId 
        where t.Id == int.Parse(CompanyID) *//<-Shows CompanyID is Undefined-* 
        select new { t, p }; 

      foreach (var item in join) 
      { 
       Represetative ph = new Represetative(); 

       //REPRESETATIVES 
       ph.Name = item.p.Name; 
       ph.Email = item.p.Email; 
       ph.ContactNumber = item.p.ContactNumber; 
       ph.Quotes = item.p.Quotes; 
       ph.CompanyId = item.p.Id; 
       //REPRESETATIVES 

       //COMPANY 
       ph.Id = item.t.Id; 
       //COMPANY 

       RepList.Add(ph); 
      } 

      return RepList; 

     } 
     catch (Exception) 
     { 
      throw; 
     } 
    } 

Когда я попытался изменить CompanyID к междунар я получаю эту ошибку при запуске моей службы:

Operation 'GetRepByCompA' in contract 'ITruckService' has a path variable named 'CompanyID' which does not have type 'string'. ÿVariables for UriTemplate path segments must have type 'string'.

+0

Не можете ли вы передать CompanyID как целое число вместо строки? – dimitarie

+0

Нет, это то, что я упомянул внизу, он говорит, что это должно быть строковое значение? @dimitarie –

+1

Преобразование id в 'int' извне:' var id = int.Parse (CompanyID); var join = from ... где где t.Id == id ...; ' – Dennis

ответ

0

Есть четыре проблемы.

  1. провайдер EF LINQ не может переводить каждый действительный C# выражение SQL, поэтому вы получаете NotSupportedException. Чтобы этого избежать, вам нужно преобразовать CustomerId из string в int перед выражением LINQ.

  2. По вашему мнению, есть дополнительная возможность передать Undefined строку как CompanyID. Очевидно, это невозможно разобрать на целое. Я предполагаю, что Undefined означает «любой». Следовательно, вам нужно выбросить where, если CompanyID - Undefined.

  3. Ваша проекция использует отметить из db.Companies но компании Id, которая уже представляет в db.Represetatives как CompanyId. Вам совсем не нужно присоединяться.

  4. Предполагая, что тип элементов в db.Represetatives отличается от Represetative, вы можете выбрать Represetative непосредственно, без промежуточного проекции в анонимный тип и список заполнения вручную.

Ваш метод может быть переписан так:

// this assumes, that "RepresetativeEntityType" is a type name of representative entity 
IQueryable<RepresetativeEntityType> representatives = db.Represetatives; 

// pre-filter representatives, if CompanyID could be parsed 
int companyIdToFilter; 
if (int.TryParse(CompanyID, out companyIdToFilter)) 
{ 
    representatives = representatives 
     .Where(_ => _.CompanyId == companyIdToFilter); 
} 

return representatives 
    .Select(_ => new Represetative 
    { 
     //REPRESETATIVES 
     Id = _.Id, 
     Name = _.Name, 
     Email = _.Email, 
     ContactNumber = _.ContactNumber, 
     Quotes = _.Quotes, 

     //COMPANY 
     CompanyId = _.CompanyId 
    }) 
    .ToList(); 

Обратите внимание, что если тип элементов в db.RepresetativesявляетсяRepresetative, вы даже не нужно проецирование, просто удалите Select и позвоните по телефону ToList.

+0

Неопределенное значение из моего измененного значения в раскрывающемся списке моего приложения. @Dennis –

+0

@RGdent: ... и? – Dennis

+0

неважно извините, ваше решение исправляет эту ошибку –

0

Заменить эту строку:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "getRepByCompA/{CompanyID}")] 
List<Represetative> GetRepByCompA(string CompanyID); 

Для этого:

[WebGet(UriTemplate="/GetRepByCompA?CompanyID={CompanyID}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "getRepByCompA/{CompanyID}")] 
List<Represetative> GetRepByCompA(string CompanyID); 

И разобрать переменную CompanyID перед операцией Linq:

int cid = int.Parse(CompanyId); 
var join = from t in db.Companies 
      join p in db.Represetatives on t.Id equals p.CompanyId 
      where t.Id == cid 
      select new { t, p }; 
+0

Почему вы меняете его на WebGet? @Tequila –

+0

Прежде всего, это что-то вроде хорошей практики, когда вы объявляете свой рабочий контракт, работая через GET Http Verb. – Tequila

+0

, имеющий оба шаблона Uri, дает ошибку дублирования: 'URITemplate 'дубликат с именем атрибут аргумент' @Tequila –

Смежные вопросы