MindingData
MindingData

Reputation: 12508

starts with over an array

I have a function like so

public List<Entry> GetEntriesForSlider(int first, int max, List<string> NameLetters)
{
    //Some code
}

Inside this code, I want to search along a database, to return every result that has the firstname starting with a letter within the NameLetters.

So if I pass in the array NameLetters = ["a","b","c"]

Then it will return results such as

Amy 
Bert 
Aaron 
Chris

It should be noted that I am ideally looking to use some sort of linq statement such as...

entries.Where(x => x.FirstName.StartsWith(partofArray));

If at all possible.

EDIT : I previously had the following :

var entries = _repository.All<Entry>().Skip(first).Take(max);
if (NameLetters != null && NameLetters.Count > 0)
    entries = entries.Where(x => NameLetters.Contains(x.FirstName[0].ToString()));

But what I found was, it enumerated the query (I think) before running the where statement. Possibly because trying to access the first letter of firstname (Or the ToString).

Upvotes: 0

Views: 2236

Answers (2)

Spooles
Spooles

Reputation: 785

Perhaps you should take a look at predicate builder.

Then something like

IQueryable<Entry> GetThingsThatBeginWithA(String[] prefixes)
{
    var predicate = PredicateBuilder.False<Entry>();
    foreach (String prefix in prefixes)
        predicate = predicate.Or(p => p.FirstName.StartsWith(prefix));
    return database.Entries.Where(predicate);
}

This query should correctly compile to a single query to the SQL store.

Update: It can also be done without predicate builder, but I find that working with expression trees without it is really tedious.

Upvotes: 0

D Stanley
D Stanley

Reputation: 152644

If you're just looking to match the first letter try:

entries.Where(x => partofArray.Contains(x.FirstName[0]));

If you need to worry about null or empty strings a safer version would be:

entries.Where(x => 
                  !string.IsNullOrEmpty(x.FirstName) &&
                  partofArray.Contains(x.FirstName[0])
             );

If you want to use variable-length strings try:

entries.Where(x => 
                   partofArray.Any( p=> x.FirstName.StartsWith(p))
             );

Upvotes: 3

Related Questions