0

I'm getting this error when trying to do a linq query:

LINQ to Entities does not recognize the method 'System.Collections.Generic.IEnumerable`1[FEI.Entities.EF6.Tables.HORSE_IDENTITY_GENDER] GetHorseIdentityGenderQuery(FEI.Entities.EF6.Tables.HORSE_DOCUMENT_PART)' method, and this method cannot be translated into a store expression.

I've read a lots of previous questions where people get the same error, but I understand that it's because LINQ to Entities requires the whole linq query expression to be translated to a server query, and therefore you can't call an outside method in it. I haven't been able to convert my scenario into something that works yet, and my brain is starting to melt down, so I was hoping someone could point me in the right direction. We're using Entity Framework and the specification pattern (and I'm new to both).

Here's the code that uses the specification:

HORSE_DOCUMENT HorseDocForPart = Bll.GetHorseDocumentForPartUpload(horseId, identityType);

Here's the code that provides from method GetHorseDocumentForPartUpload

public HORSE_DOCUMENT GetHorseDocumentForPartUpload(int horseID, HorseDocGender identityType)
{
    // Get the unique horse document
    var horseDoc = Tables
        .HORSE_DOCUMENT
        .Where(hd =>
            hd.HORSE_UID == horseID &&
            hd.HORSE_IDENTITY_TYPE.HORSE_IDENTITY_TYPE_FULL_CODE == identityType.ToString() && 
            !hd
                .HORSE_DOCUMENT_PART
                .Any(hdp =>
                    hdp.VALIDATION_STATUS != HorseDocPartStatus.REFUSED.ToString() && 
                    GetHorseIdentityGenderQuery(hdp).Any(hig => hig.IS_FULL)
                )
        ).SingleOrDefault();
    return horseDoc;
}

Here's the last code :

public IEnumerable<HORSE_IDENTITY_GENDER> GetHorseIdentityGenderQuery(HORSE_DOCUMENT_PART horseDocPart)
{
    var possibleDocs = Tables
        .DOCUMENTs
        .Where(doc => doc.DOC_OWNER_UID == horseDocPart.HORSE_DOCUMENT_PART_UID);

    return horseDocPart
        .HORSE_DOCUMENT
        .HORSE_IDENTITY_TYPE
        .HORSE_IDENTITY_GENDER
        .Join(
            possibleDocs,
            hig => hig.DOCUMENT_GENDER_CODE.DOCUMENT_GENDER_CODE_UID,
            doc => doc.DOCUMENT_GENDER_CODE_UID,
            (dgc, doc) => dgc
        );
} 
Wax Tailor
  • 13
  • 4

1 Answers1

0

You return IEnumerable from the method

public IEnumerable<HORSE_IDENTITY_GENDER> GetHorseIdentityGenderQuery(...)

This is deferred but using IEnumerable does not allow Linq-To-Sql execution, you should be using IQueryable as such.

public IQueryable<HORSE_IDENTITY_GENDER> GetHorseIdentityGenderQuery(...)

Please see more detailed explanation from Returning IEnumerable<T> vs. IQueryable<T>

Community
  • 1
  • 1
Janne Matikainen
  • 5,061
  • 15
  • 21