Использование строковых функций.NET в разделе where LINQ

70
7

Как я могу использовать строковые функции.NET framework в запросе LINQ?

var accounts = from a in orgContext.CreateQuery("account")
where a["telephone1"].ToString().Replace("-","") == "1234567890"
orderby a["name"]
select new { id = a["accountid"], name = a["name"], telephone1 = a["telephone1"]};

Это заканчивается ошибкой:

Invalid 'where' condition. An entity member is invoking an invalid property or method.

ОБНОВИТЬ
Я пробовал этот запрос LINQ с тестовым db в SQL Server после классов сущностей генной генерации и успешно возвращает результат:

from Account in db.Account
where Account.Telephone1.Replace("-", "").Substring(Account.Telephone1.Replace("-", "").Length - 10, 10) == "1234567890"
select new {
Account.AccountId,
Account.Name,
Account.Telephone1
}

Но поскольку я LINQ-запрос в Dynamics CRM с использованием поздних связанных объектов, как показано в первом примере кода (без классов объектов в проекте), приложение закончило ошибку времени выполнения.

PS: Я не могу использовать ранние связанные объекты, потому что это может нарушить решение, когда клиенты добавят какой-либо атрибут в объект Dynamics CRM.

спросил(а) 2015-02-26T18:48:00+03:00 5 лет, 7 месяцев назад
1
Решение
91

Вы можете использовать метод SqlFunctions.StringConvert.

Это ссылка msdn https://msdn.microsoft.com/en-us/library/dd466166.aspx

var accounts = from a in orgContext.CreateQuery("account")
where SqlFunctions.StringConvert(a["telephone1"]).Replace("-","") == "1234567890"
orderby a["name"]
select new { id = a["accountid"], name = a["name"], telephone1 = a["telephone1"] };

ответил(а) 2015-02-26T18:53:00+03:00 5 лет, 7 месяцев назад
81

Ты не сможешь это сделать. Поставщик Dynamics CRM LINQ не поддерживает эту возможность, поскольку QueryExpression не поддерживает этот поиск.

https://msdn.microsoft.com/en-us/library/gg334607.aspx

Запросы создаются с использованием стандартного языка, но внутренне используют QueryExpression, поэтому ограничиваются функциями QueryExpression.

Для выполнения этого поиска вам необходимо очистить значение в CRM. У меня были проблемы с интеграцией TAPI (телефон). Решение заключалось в создании плагина на Create/Update, который заменил номер телефона, и поместил значение в другое поле (т.е. "New_cleanphonenumber"), которое затем можно было бы найти.

Вы можете использовать один и тот же код очистки, чтобы написать простую утилиту командной строки, чтобы пройти и обновить все существующие значения.

ответил(а) 2015-02-27T00:15:00+03:00 5 лет, 7 месяцев назад
58

Эта часть вашего запроса: a["telephone1"].ToString().Replace("-","") нельзя преобразовать в действительный оператор SQL или что-то другое, что является основным языком домена. При использовании linq-to-entity ваши запросы должны быть выражены в SQL-запасе вашей базовой базы данных или на языке домена для сущности, если не на базе SQL. При использовании linq-to-objects это не так, и ваш запрос будет действительным.

Вы можете использовать статические методы в SqlFunctions в запросе linq-to-entity, но, как вы уже заметили, на самом деле у вас не так много вариантов для строковых манипуляций. Кроме того, ваш основной объект - dynamic-crm, поэтому, если вы напрямую не подключаетесь к базе данных SQL, вы, вероятно, не сможете использовать SQL-выражения.

В вашем случае вам нужно будет преобразовать телефонную строку в соответствующий формат, прежде чем использовать ее в запросе. Тем не менее, я вижу, что вы сравниваете с постоянной строкой "1234567890", поэтому вместо удаления тире от динамического объекта поместите тире в вашу постоянную строку, например "123-456-7890 ", если это телефонный номер как предлагает ваш запрос.

ответил(а) 2015-02-27T00:09:00+03:00 5 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема