NotSupportedException被捕获

时间:2015-12-08 06:58:27

标签: c# .net entity-framework linq wcf

我有一个WCF方法,我在两个表之间进行连接。现在我遇到了这个错误:

  

LINQ to Entities无法识别方法'Int32 Parse(System.String)'方法,并且此方法无法转换为商店表达式。

当我查看断点时,我在“操作合同”中创建的变量显示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更改为int时,运行我的服务时出现此错误:

  

合同'ITruckService'中的'GetRepByCompA'操作有一个名为'CompanyID'的路径变量,它没有'string'类型。 ÿUriTemplate路径段的变量必须具有“string”类型。

2 个答案:

答案 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);

在Linq操作之前解析您的CompanyID变量:

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 };

答案 1 :(得分:0)

有四个问题。

  1. EF LINQ提供程序无法将每个有效的C#表达式转换为SQL,这就是您获得NotSupportedException的原因。为避免这种情况,您必须在LINQ表达式之前将CustomerIdstring转换为int

  2. 根据您的评论,可以选择将Undefined字符串作为CompanyID传递。显然,这不能解析为整数。我假设,Undefined表示“任何”。因此,如果whereCompanyID,则需要丢弃Undefined条件。

  3. 您的预测使用来自db.Companies但公司Id的注释,该注释已在db.Represetatives中显示为CompanyId。你根本不需要加入。

  4. 假设db.Represetatives中的该类型的项目与Represetative不同,您可以直接选择Represetative,而无需手动中间投影到匿名类型和填充列表。

  5. 您的方法可以像这样重写:

    // 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并调用{{1 }}