пытаясь вызвать метод в месте где linq statment - PullRequest
8 голосов
/ 11 января 2012

Ниже приведен код, который я использую, но он отвечает

Метод 'Boolean isUser (System.String)' не поддерживает перевод на SQL.

Любая помощь?Кстати, я использую linq to SQL источник данных

public void dataBind()
{
    using (var gp = new GreatPlainsDataContext())
    {
        var emp = from x in gp.Employees
                  let k = isUser(x.ID)
                  where x.ActivtyStatus == 0
                  && isUser(x.ID) != false
                  orderby x.ID
                  select new
                  {
                      ID = x.ID,
                      Name = x.FirstName + " " + x.MiddleName
                  };
        ListView1.DataSource = emp;
        ListView1.DataBind();
    }
}

public static bool isUser(string ID)
{
    int temp;
    bool x = int.TryParse(ID, out temp);
    return x;
}

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


обновленный код, который работал в конце после использования подобного, как рекомендовано Андерсом Абелем

public void dataBind()
    {
        using (var gp = new GreatPlainsDataContext())
        {
            var emp = from x in gp.Employees
                      where x.ActivtyStatus == 0
                      && SqlMethods.Like(x.ID, "[0-9]%")
                      orderby x.ID
                      select new
                      {
                          ID = x.ID,
                          Name = x.FirstName + " " + x.MiddleName
                      };
            ListView1.DataSource = emp;
            ListView1.DataBind();
        }
    }

Ответы [ 5 ]

6 голосов
/ 11 января 2012

Linq-to-sql переводит запрос в SQL.Он только умеет переводить ограниченный набор встроенных функций.Вы должны переписать свой запрос, чтобы он не включал вашу собственную функцию.

Полный список поддерживаемых функций и операторов linq-to-sql можно найти по адресу MSDN .

Вы можете использовать SqlMethods.Like(), чтобы проверить, содержит ли поле только цифры.См. T-SQL IsNumeric () и Linq-to-SQL для примера.

3 голосов
/ 11 января 2012

Проблема, с которой вы столкнулись, заключается в том, что, поскольку запрос должен выполняться в базе данных, вы можете использовать только те вещи, которые будут работать с базой данных, а код C # в вашем методе isUser не может выполняться в базе данных. .

Вам придется переписать его без использования этой функции. Возможно, у вас есть таблица, в которой перечислены пользователи по идентификаторам, к которым вы можете присоединиться?

0 голосов
/ 11 января 2012

В качестве альтернативного решения вы можете вызывать любую встроенную пользовательскую функцию sql в запросах LINQ, например gp.isUser(x.ID), так что вы можете определить эту функцию isUser как SQL UDF, например:

 CREATE FUNCTION isUser(@id int)
 RETURNS bit;
 AS
 BEGIN
    if exists(select * from Users where userId = @id)
    begin 
          return 1; --true the user exists;
    else 
          return 0; --false doesn't exist;
    end
 end

Затем вам нужно определить этот UDF в вашем .DBML файле , который содержит другие сопоставления определений таблиц и процедур.Затем вы можете вызвать его или любую другую встроенную функцию UDF в вашем запросе LINQ, например:

var emp = from x in gp.Employees
              let k = gp.isUser(x.ID)
              where x.ActivtyStatus == 0
              && gp.isUser(x.ID) != 1
              orderby x.ID
              select new
              {
                  ID = x.ID,
                  Name = x.FirstName + " " + x.MiddleName + " " + x.LastName
              };
0 голосов
/ 11 января 2012

Вы можете назвать этот код:

var emp = from x in gp.Employees
                  where x.ActivtyStatus == 0
                  orderby x.ID

И получите действительный результат, поскольку каждое выражение linq может быть применено к Сотрудникам через linq to sql. Затем вы можете привести emp к списку или массиву и отфильтровать коллекцию, используя ваш метод isUser.

0 голосов
/ 11 января 2012

Вам будет проще запросить ID, действительный для вас, , например, where ID > 0, восстановить результаты, и после этого в результирующем наборе выполнить требуемый гипотетический фильтр с помощью

isUser(x.ID)

потому что, я полагаю, это как-то выполняет более сложную проверку.

Важно, чтобы из БД результаты были на меньше, чем возможно , чтобы избежать задержки передачи данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...