我有一个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”类型。
答案 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)
有四个问题。
EF LINQ提供程序无法将每个有效的C#表达式转换为SQL,这就是您获得NotSupportedException
的原因。为避免这种情况,您必须在LINQ表达式之前将CustomerId
从string
转换为int
。
根据您的评论,可以选择将Undefined
字符串作为CompanyID
传递。显然,这不能解析为整数。我假设,Undefined
表示“任何”。因此,如果where
为CompanyID
,则需要丢弃Undefined
条件。
您的预测使用来自db.Companies
但公司Id
的注释,该注释已在db.Represetatives
中显示为CompanyId
。你根本不需要加入。
假设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
并调用{{1 }}