从动态where

时间:2016-10-28 03:29:34

标签: c# database linq

数据库中包含三列的表,Id,Word,Opposite(在“Word”和“Opposite”下面的上下文中是表中的实际数据/值)

来自Word的值是通过控制器中的LINQ查询得到的,并发送到视图并显示为列表。在Word旁边有一个@EditorFor,用户应该输入相反的内容。

在视图中,DisplayFor(即Word)和EditorFor(输入框)获得从零开始的索引。用户输入被发送到控制器,该控制器将模型作为参数传递。从模型中找到猜测的对立面,并将其放入List<string> and is compared to another列表that contains the actual values from the column Word`中。

截至目前,我可以从@ÈditorFor获取用户输入,并且从我拥有的数据中我可以得到正确的猜测Opposites和错误的猜测Opposites。但我无法从同一行Word中获取Opposite列中的值,无论是正确还是错误。

对面就像是

var list = oppositeListFromDB.Except(guessesFromUser);

我最初的想法是使用正确相反的值进行另一个LINQ查询并选择匹配的Word。澄清如果用户在第5行和第6行猜错,单词“Dry”和“Old”将用作列表中的where参数。但参数必须是动态的,我该如何解决这个问题呢?我尝试了类似下面的东西,但它不起作用。我是否正确思考或有更好的方法?

var q = from a in db.Table
        where a.Opposite.Contains(list)
        select a.Word;

使用MVC 5并拥有如下所示的模型,List用于项目的另一部分。我可以在这里使用它来解决我的问题吗?

public class MyModel
{
    public string Word { get; set; }
    public string Opposite { get; set; }
    public List<WordCl> mWords { get; set; }

}
public class WordCL
{   public int Id { get; set; }
    public string Word { get; set; }
    public string Opposite { get; set; }
}





+----+-------+----------+
| ID | Word  | Opposite |
+----+-------+----------+
|  1 | Rain  | Sun      |
|  2 | Clean | Dirty    |
|  3 | Light | Dark     |
|  4 | Hot   | Cold     |
|  5 | Wet   | Dry      |
|  6 | Young | Old      |
+----+-------+----------+

2 个答案:

答案 0 :(得分:1)

var guessed = foo;
var opposite = db.Table.AsEnumerable().Where(x.Opposite == guessed).FirstOrDefault();

id(opposite != null)
{
    //to get the word from the opposite
    var wordFromOpposite = opposite.Word;

    if(!db.Table.AsEnumerable().Any(x => x.Word == word && x.Opposite == guessed))
    {
       ...Notify the user he guessed wrong
    }
}

其中word是向用户显示的内容,foo是用户输入的值。

答案 1 :(得分:1)

我很难想象您可以获得哪些数据以及您尝试收集哪些数据。

您可以使用匿名类型对象选择您感兴趣的字段:

var result = from a in db
             where a.Word == "..."
             select new { a.Opposite, a.Word };

foreach (var r in result)
{
    Console.WriteLine(r.Opposite);
    Console.WriteLine(r.Word);
}

顺便说一下(不能发表评论):

where a.Opposite.Contains(list)

不应该是where list.Contains(a.Opposite),否则你就会在字符串上调用Contains吗?