Asp.net web api Web API OData V3按字符串获取实体(电子邮件)

Asp.net web api Web API OData V3按字符串获取实体(电子邮件),asp.net-web-api,odata,Asp.net Web Api,Odata,我正在创建一些供内部使用的Web API,其中一个将与其交互的第三方应用程序只能使用odata v3(即,不使用odata v4) 我正在尝试从这个Web API查询另一个第三方应用程序-通过电子邮件获取联系人,但不确定如何通过字符串而不是id获取联系人 我有这样一个简化模型: public class Contact { [Key] public int Id { get; set; } public string Email { get; set; } pub

我正在创建一些供内部使用的Web API,其中一个将与其交互的第三方应用程序只能使用odata v3(即,不使用odata v4)

我正在尝试从这个Web API查询另一个第三方应用程序-通过电子邮件获取联系人,但不确定如何通过字符串而不是id获取联系人

我有这样一个简化模型:

public class Contact
{
    [Key]
    public int Id { get; set; }
    public string Email { get; set; }
    public string CompanyName { get; set; }
}
简化控制器:

public IHttpActionResult GetContact([FromODataUri] int key)
{
    var contact = _repository.GetContact(key);

    // return..
}
简化WebApiConfig

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
var container = new UnityContainer();
container.RegisterType<IContactRepository, ContactRepository>(new ContainerControlledLifetimeManager());
config.DependencyResolver = new UnityResolver(container);
builder.EntitySet<Contact>("Contacts");
config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
我还将控制器中的键输入参数从int更改为string 它由Id和电子邮件组成一个复合密钥

<EntityType Name="Contact">
<Key>
<PropertyRef Name="Email"/>
<PropertyRef Name="Id"/>
</Key>
如果我想通过电子邮件获得联系(并通过这种方式获得回复的id),我是否已步入正轨,或者我是否必须做一些完全不同的事情


提前感谢。

您应该传递int-Id和电子邮件,因为它是一个复合键,在您的场景中,我认为您的意思是
AlternateKey
,它在V4中得到支持。好的,我不能使用V4,我需要传递电子邮件以获取联系人的Id,这就是我被困的地方。你可以只使用一个过滤器而不是修改实体键吗<代码>http://xxx:52759/odata/Contacts?$filter=Email eq'some@email.com“
builder.EntitySet<Contact>("Contacts").EntityType.HasKey(c => c.Email); 
<EntityType Name="Contact">
<Key>
<PropertyRef Name="Email"/>
<PropertyRef Name="Id"/>
</Key>
<EntityType Name="Contact">
<Key>
<PropertyRef Name="Email"/>
</Key>