LINQ中的“IN ALL”子句

时间:2013-07-26 00:44:26

标签: c# linq ravendb

public class ReduceResult
{
    public string Text { get; set; }
    public string UserName { get; set; }
    public string ProfileImageUrl { get; set; }
}

示例记录:

UserName        Text
UsernameA       Text1, Text2, Text3 
UsernameB       Text2, Text3, Text4
UsernameC       Text1, Text2, Text3

我要求用户包含where子句中提到的所有文本。例如

如果where子句包含Text IN { Text1, Text2, Text3 },我应该获得用户'A''C'的记录,因为所有必需的文本都包含在他们的记录中。 我不应该获得用户'B'记录,因为'Text1'在他的记录中不存在。我需要使用LINQ来实现它。你能指导我正确的方向吗?

3 个答案:

答案 0 :(得分:0)

如果你可以修改ReduceResult类,那么你可以实现IEquatable并添加Equals方法并覆盖GetHashCode()。 像这样:

public class ReduceResult: IEquatable<ReduceResult>
{
    public string Text { get; set; }
    public string UserName { get; set; }
    public string ProfileImageUrl { get; set; }

    public bool Equals(ReduceResult other)
    {

    }

    public override int GetHashCode()
    {

    }   
}

然后,您可以比较任何其他主要类型(如int,string)来比较两个ReduceResult。 例如,ReduceResult1 == ReduceResult2

如果没有,那么你可以创建一个Comparer类:

class ReduceResultComparer : IEqualityComparer<ReduceResult>
{
    public bool Equals(ReduceResult x, ReduceResult y)
    {

    }

    public int GetHashCode(ReduceResult reduceresult)
    {

    }
}

并像这样使用它:

    //This outside your linq query
    var comparer = new ReduceResultComparer(); 

    //This inside query
    comparer.Equals(ReduceResult1, ReduceResult2) 

答案 1 :(得分:0)

如果我理解你的问题是正确的,这只是一个像这样的常规where子句。

var data = from x in listOfObjects
                   where x.Text == "Text1, Text2, Text3"
                   select new ReduceResult
                   {
                       UserName = x.UserName,
                       ProfileImageUrl = x.ProfileImageUrl,
                       Text = x.Text,
                   };

答案 2 :(得分:0)

你应该这样做:

string[] texts = new string[]{"Text1", "Text2", "Text3"};
var records = from x in list
              let a = from b in x.Text.Split(',') select b.Trim()
              where a.Intersect(texts).Count() == texts.Count()
              select x;