Glen J Fergo
Glen J Fergo

Reputation: 134

Build Where Clause (not sure PredicateBuilder will work for me)

I am trying to query a database using LINQ. I am joining TableA with TableB with TableC.

I have zero to many 'keywords' (don't know how many at design time) that I would like to look for within (LIKE '%%') several fields that are spread across the three tables.

Assuming three (3) keywords are entered into my search box:

In T-SQL I would have this -

SELECT tbl0.FieldA, tbl0.FieldB, tbl1.FieldC, tbl1.FieldD, tbl2.FieldE, tbl2.FieldF

FROM tbl0

JOIN tbl1 ON tbl0.KeyField = tbl1.KeyField

JOIN tbl2 ON tbl1.KeyField = tbl2.KeyField

WHERE (tbl0.FieldA LIKE '%{keyword1}%' OR tbl1.FieldC LIKE '%{keyword1}%' OR tbl2.FieldE LIKE '%{keyword1}%' OR tbl0.FieldA LIKE '%{keyword2}%' OR tbl1.FieldC LIKE '%{keyword2}%' OR tbl2.FieldE LIKE '%{keyword2}%' OR tbl0.FieldA LIKE '%{keyword3}%' OR tbl1.FieldC LIKE '%{keyword3}%' OR tbl2.FieldE LIKE '%{keyword3}%')

Question is -- How do I 'dynamically' build this WHERE clause in LINQ?

NOTE #1 -- I do not (for reasons outside the scope of this question) want to create a VIEW across the three tables

NOTE #2 -- Because I am joining in this way (and I am still new to LINQ) I don't see how I can use the PredicateBuilder because I am not sure what TYPE (T) to pass into it?

NOTE #3 -- If it matters ... I am ultimately planning to return a strongly typed list of (custom) objects to be displayed in a GridView.

EDIT - 8/17/2012 - 5:15 PM EDT

The comment below is correct.

"The code the OP is looking for is where any one of the fields contains any one of the keywords."

Thanks everyone!

Upvotes: 3

Views: 384

Answers (1)

david.s
david.s

Reputation: 11403

Here's a solution not using the PredicateBuilder. Just get all the items containing the first keyword and merge it with all the items containing the second keyword and so on. Not knowing anything about the context of the problem I can't tell if this will be efficient or not.

var query = from t0 in db.Table0
            join t1 in db.Table1 on t0.KeyField equals t1.KeyField
            join t2 in db.Table2 on t1.KeyField equals t2.KeyField
            select new
            {
                t0.FieldA, t0.FieldB,
                t1.FieldC, t1.FieldD,
                t2.FieldE, t2.FieldF
            };

string keyword = keywordsList[0];
var result = query.Where(x => x.FieldA.Contains(keyword) ||
                              x.FieldC.Contains(keyword) ||
                              x.FieldE.Contains(keyword));

for (int i = 1; i < keywordsList.Length; i++)
{
    string tempkey = keywordsList[i];
    result = result.Union(query.Where(x => x.FieldA.Contains(tempkey) ||
                                           x.FieldC.Contains(tempkey) ||
                                           x.FieldE.Contains(tempkey)));
}

result = result.Distinct();

Upvotes: 3

Related Questions