是否可以通过数据注释设置where子句?

时间:2017-08-05 14:41:05

标签: c# asp.net asp.net-web-api data-annotations

可能这是一个愚蠢的问题。

我在Asp.Net web api 2.2应用程序中有一些模型类,它实现了一个接口ICountryOfOrigin

我需要通过应用where子句来过滤记录,如下所示。我必须在许多控制器中重复这个逻辑,这些控制器具有实现ICountryOfOrigin的不同模型。

是否可以将过滤逻辑移动到单独的方法中并通过数据注释将其应用于控制器操作?

我的目的是消除重复的代码。

有可能吗?

//Interface
public Interface ICountryOfOrigin
{
    string Country {get;set;}
}

//Model
public class Product : ICountryOfOrigin
{
    ..
    string Country {get;set;}
}

//Action
public IHttpActionResult Get()
{
    List<string> euCountries = GetEuCountries();
    Product product = _repository.Products.GetAll().Where(p=> euCountries.Contains(p.countries); // The filter is applied here
    return Ok(products);
}


//Need to achieve something like this
[EuCountriesOnly]
public IHttpActionResult Get()
{
  List<string> euCountries = GetEuCountries();
  Product product = _repository.Products.GetAll();
  return Ok(products);
}

有专家帮我这个吗?

1 个答案:

答案 0 :(得分:0)

我想我会拍摄任何以你想要的方式实现它的人。相信我,用你在调用方法上放置的属性改变你正在调用的某个方法的行为并不酷。

只需将逻辑放入存储库类型的扩展方法中,并将其调用一天:

public static class RepoExtensions
{
  private static readonly euCountries = new Country[]{};
  public static IEnumerable<ICountryOfOrigin> GetEU(this Repository repo)
  {
    return repo.Products.GetAll().Where(p=> euCountries.Contains(p.countries);
  }
}

我假设您的存储库类型为Repository,您需要输入真实类型而不是它。