如何在ASP.NET控制器上向IQuerable方法发送查询?

时间:2016-04-29 06:19:12

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

我正在使用Entity Framework 6并尝试从我的控制器获取一些数据。数据来自一个单词表,其中键为WordId(实际单词)。

我的控制器有这种方法:

[Route("Get")]
public IQueryable<Word> Get()
{
   return db.Words;
}

这是我的Word对象:

    public class Word
    {
        public string WordId { get; set; } // WordId (Primary key) (length: 20)
        public int CategoryId { get; set; }
    }

有没有办法可以使用这种方法来获取A和E之间有第一个字符的单词?

2 个答案:

答案 0 :(得分:0)

永远不要从控制器返回EntityIQueryables,而是创建一个模型并按以下所述返回:

string matchStr = "abcde";

[Route("Get")]
public List<WordModel> Get()
{      
    return db.Words.Where(p=>matchStr.ToUpper().Contains(p.UniqueID.ToUpper().FirstOrDefault())).Select(p=>new WordModel(){
    WordId  = p.WordId,
    CategoryId  = p.CategoryId 
    }).ToList();
}

创建模型类WordModel,为

public class WordModel
{
    public string WordId { get; set; }
    public int CategoryId { get; set; }
}

答案 1 :(得分:0)

我同意索菲亚的观点。公开视图模型(基于视图设计)而不是实际实体是一个好主意。让我们假设WordVm就是你的情况。控制器动作的返回类型将是List。添加将从您的操作方法调用的reporsitory或manager类,以返回结果。我正在创建一个可以访问带有Word实体的db上下文类的管理器。

[Route("Get")]
public List<WordVm> Get()
{

    var manager = new WordsManager()

   return manager.GetWords();
}



  public class WordsManager
  {
     public List<WordVm> GetWords()
     {
       return repo.Words.Where(a => {
           var t = a.Trim().ToUpper().Substring(0, 1)[0]; 
           return t >= 'A' && t <= 'E';
          }).ToList();
     }
   }

谢谢你, 索马。