Как конвертировать bool в выражение - PullRequest
0 голосов
/ 11 апреля 2020
var item = Db.BuyFactorWithTag.Where(b =>
     !b.IsSell && SearchUtility.SearchPersonByName(MR_SANAD_BASE , b.FK_Seller , input)).ToList();

public static bool SearchPersonByName(MrSanadBaseDb.Entities db, long? id, string input)
{
      id = id ?? 0;
      return db.Person.FirstOrDefault(p => p.PK_Person == id && !p.IsDeleted && p.FullName.Contains(input)) != null;
}

У меня есть SearchByPersonName во многих местах и ​​превратил его в метод, но Linq не позволяет мне его запустить и выдает мне эту ошибку. Как я могу исправить эту ошибку?

Текст ошибки

LINQ to Entities не распознает метод 'Boolean SearchPersonByName (MrSanadBaseDb.Entities, System.Nullable` 1 [System.Int64], System.String) ', и этот метод нельзя преобразовать в выражение хранилища.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Ответ на этот вопрос можно найти здесь .

Entity Framework использует выражения, поэтому он может прочитать синтаксис содержимого LINQ и пытается преобразовать его в sql. C# вызовы методов не являются чем-то, что он конвертирует в sql. Если вы хотите больше узнать об этом, вы можете прочитать здесь

0 голосов
/ 12 апреля 2020

Как упоминалось @ KingOfArrows , ваш метод SearchByPerson не может быть переведен, поэтому вам нужно записать этот метод в Expression. Более того, Entity Framework позволяет писать подзапросы в одном и том же контексте.

Так что вы можете написать LINQ следующим образом:

var item = Db.BuyFactorWithTag.Where(b =>
     !b.IsSell && 
     DB.Person.Any(p =>  p.PK_Person == (b.FK_Seller.HasValue ? b.FK_Seller.Value : 0) && !p.IsDeleted && p.FullName.Contains(input))).ToList();
...