2013-07-26 61 views
1
public class ReduceResult 
{ 
    public string Text { get; set; } 
    public string UserName { get; set; } 
    public string ProfileImageUrl { get; set; } 
} 

样本记录:“在所有”条款在LINQ

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

我需要的用户,包括所有的where子句中提到的文字。例如

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

回答

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; 
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() 
    { 

    } 
} 

然后,您可以比较两个ReduceResult像任何其他主要类型如int,字符串。 例如,ReduceResult1 == ReduceResult2

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

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) 
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, 
        };