Объединение сущности LINQ при использовании функции усечения параметра - PullRequest
0 голосов
/ 09 октября 2018

У меня есть t.arg, который содержит "abc|efg|xyz" и b.arg, который равен "xyz" Я хочу сравнить их при создании соединения:

join t in db.Tdb on b.arg.Substring(b.arg.LastIndexOf('|') + 1)  equals t.arg

Я получаю следующую ошибку:

LINQ to Entities не распознает метод метода Int32 LastIndexOf (Char), и этот метод нельзя преобразовать в выражение хранилища. '

оба аргументаэто строки

Что можно сделать, чтобы решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Это означает, что для метода LastIndexOf нет встроенного преобразования Linq -> T-SQL.AFAIK, непосредственно в SQL-сервере нет соответствующей функции.Вам нужно будет:

  1. Написать в вашей базе данных скалярную пользовательскую функцию, которая выполняет операцию, эквивалентную LastIndexOf
  2. Добавить метод оболочки, украшенный атрибутом EdmFunction, к вашему C #код, который обрабатывает перевод в функцию T-SQL, как описано здесь: https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/how-to-call-custom-database-functions
0 голосов
/ 09 октября 2018

По сути, вы пытаетесь написать эквивалент SQL bArg = tArg OR bArg LIKE '%|' + tArg.Я считаю, .EndsWith должно достичь этого для вас.К сожалению, невозможно использовать его в части join, но вы можете использовать его в части where.

var result = 
    from b in collection1
    from t in collection2
    where b.arg == t.arg || b.arg.EndsWith("|" + t.arg)
    select new { B = b, T = t };

Предложение where здесь должно быть примерно эквивалентно вашему SQLquery.

Поскольку вы не видели, как a == b || EndsWith имеет отношение, рассмотрите следующие примеры, почему он работает:

  • abc|def|ghi присоединение ghi
  • ghi присоединение ghi

Если мы используем ваш метод, мы получим следующие результаты от вашего Substring:

  • abc|def|ghi становится ghi
  • ghi, поскольку он не содержит | получает индекс -1, который с + 1 делает его 0, таким образом, он просто становится ghi

Теперь, что произойдет, если мы используем == и EndsWith?

  • "abc|def|ghi" не == "ghi", но оно заканчивается на "|ghi", поэтому оно удовлетворяет условию.
  • "ghi" делает == "ghi", поэтому он удовлетворяет условию.

Попробуйте онлайн

...