EF获得每个项目的记录

时间:2016-03-06 11:46:28

标签: c# .net entity-framework

大家好,这是我到目前为止所做的。

public List<Word> GetWords(string[] words)
{
      return DbContext.Words.Where(w => words.Contains(w.Value.ToLower());
}

问题在于,当我传递包含两个相同单词的List时,我得到一个实体。什么可以成为获得每个单词的实体的有效方法,即使它是重复的?

2 个答案:

答案 0 :(得分:2)

鉴于此简化测试用例,sourceData代表您的DbContext.Words

var sourceData = new string[]
{
    "a",
    "b",
    "c"
};

var wordsToFind = new string[]
{
    "a",
    "a"
};

一种愚蠢的方式是为每个请求的输入执行查询:

var foundWords = wordsToFind.Select(w => 
    sourceData.Where(s => s.Contains(w.ToLower()))).ToList();

或者您可以执行一次查询,然后通过再次在内存中执行查询来复制每个输入的结果:

var foundWords = sourceData.Where(w => 
    wordsToFind.Contains(w.ToLower())).ToList();

var result = wordsToFind.SelectMany(w => 
    foundWords.Where(f => 
        f.Contains(w.ToLower()))).ToList();

答案 1 :(得分:1)

不确定您是否需要子字符串或相等的单词,在查询后返回多个记录但检查相同的单词而不是子字符串。

public List<Word> GetWords(string[] words)
{
      var results = from word in DbContext.Words.ToArray()
                        join str in words on word.ToLower() equals str
                    select word;

      return results.ToList();          

}

编辑:首先从数据库中获取已过滤的记录,然后再次将其与数组连接以获取多条记录。同样检查两次。存储过程对于大型集合来说会更有效。

public List<Word> GetWords(string[] words)
{
      var results = from word in DbContext.Words
                          .Where(w =>  words.Contains(w.Value.ToLower())
                          .ToArray()
                        join str in words on str.Contains(word.ToLower()) 
                                       equals true
                    select word;

      return results.ToList();               

}