2013-07-26 88 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, 
        };