Добавление пользовательской функции в оператор linq - PullRequest
1 голос
/ 08 сентября 2010

Привет, ребята.
Я хочу искать в поле ключевых слов, например, ключ поиска в наборе.
Например, мой ключ - это ключевые слова "Wing", это "Wing Dress Others" с пробелами, что мне вместо этого написать?
Ошибка: метод «Boolean Compare (System.String, System.String)» не поддерживает перевод на SQL.

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.QueryString.HasKeys())
    {
        DbDataContext db = new DbDataContext();
        var Query = from n in db.Products
                    where Compare(n.Keywords, Request.QueryString["key"])
                    select n;
        DataList1.DataSource = Query;
        DataList1.DataBind();
    }
}

bool Compare(string keywords,string key)
{
    string[] items = keywords.Split(' ');
    foreach (string item in items)
        if (item.Equals(key)) return true;
    return false;
}

Ответы [ 2 ]

5 голосов
/ 08 сентября 2010

Подобные очереди / ответы: Пользовательский метод в запросе LINQ to SQL

Проверьте эту полную статью: Что есть и что невозможно с linq

Следующее невозможно

// function used in filter
static bool MyFunc(Nwind.Product p)
{
  return p.ProductName.StartsWith("B");
}
// query that uses MyFunc
var q = 
  from p in db.Products
  where MyPriceFunc(p.UnitPrice) > 30m
  select p

Компилируется без ошибок, но при выполнении LINQ to SQL выдает исключение, говорящее: «Статический метод System.Boolean MyTest (LINQTest.Nwind.Product)не поддерживает перевод на SQL. "

Исключение фактически выдается при попытке извлечь результаты из q (например, с помощью оператора foreach), потому что LINQ to SQL пытается преобразовать деревья выражений в T-SQL только тогда, когда нужны результаты изапрос должен быть выполнен.

Чтобы исправить пример, вы можете просто скопировать код, который проверяет, начинается ли название продукта с «B» в предложении where запроса, и он будет работать нормально.

2 голосов
/ 08 сентября 2010

В этом случае вместо того, чтобы вы сами сделали Compare, вы можете использовать Contains, который проверяет, есть ли строка в строке. это работает для LINQ

пример:

    var Query = from n in db.Products
                where n.Keywords.Contains(Request.QueryString["key"])
                select n;

Содержит также работы для массивов.

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