amnesia
amnesia

Reputation: 1988

Partial string matching with LINQ/C#

This seems like it should be straightforward, but I can't figure out how to make it work. Imagine the following models:

public class ModelA
{
    public string Code {get;set;}
}

public class ModelB
{
    public string Code {get;set;}
}

I am reading a set of ModelA out of a database, and I also need to grab ModelB based on the Code. The kicker is I need to match only a part of the code.

For example, ModelA the code might be "1234.00" and ModelB the code might be "001234.20" -- I want to link the two models based on both codes containing the 1234 part. I would prefer it to be a join, but I don't see how that's possible, so iterating through the first data set and matching them is fine too, but I still can't make that work.

I created a string extension method called TruncateCode, which will give me the part that I want, but LINQ doesn't seem to support calling extensions within a comparison or join (throws an exception complaining the method is unrecognized and can't be used). This is basically what I was attempting:

var query = a in db.ModelASet
    (where clause)
    select a;

foreach(ModelA item in query)
{
    var query2 = b in db.ModelBSet
       where b.Code.TruncatedCode() == item.Code.TruncatedCode()   // this doesn't work :(
       select b;
}

Dear reader, how would you approach this?

(INB4 "Why is your data laid out like this?" - This is a legacy database from over 10 years ago man, I'm just trying to get this to work.)

Upvotes: 2

Views: 627

Answers (1)

Doug
Doug

Reputation: 15513

You need to materialize the results using ToList() or something similar in order to use your extension method.

var list = (a in db.ModelASet
    select a).ToList();

foreach(var item in list)
{
    var query2 = b in list
       where b.Code.TruncatedCode() == item.Code.TruncatedCode()   // this doesn't work :(
       select b;
}

Upvotes: 1

Related Questions