Linq to SQL Join и содержит операторы - PullRequest
1 голос
/ 20 ноября 2010

в следующем запросе

  var restrictions = from p in dcTrad.quop_restricted_items
                           where p.entry_status == 'P' && p.batch == "PRODUCTION" && p.problem != null
                           from q in dcTrad.model_companies
                           where   q.co_name != null && p.brimsec == q.primary_bsec                            
                           select new { Company = q.co_name, Restriction = p.comment ?? "Restricted without comments", Portfolio = p.problem };

мне нужно заменить

p.brimsec == q.primary_bsec 

с

p.brimsec.StartsWith ( q.primary_bsec  )

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

Only arguments that can be evaluated on the client are supported for the String.StartsWith method

Как я могу заставить эту работу?

Ответы [ 3 ]

1 голос
/ 13 декабря 2010

К сожалению, переводчик LINQ to SQL недостаточно умен, чтобы переводить этот код, но есть хитрость, которая достигает того же:

p.brimsec.StartsWith ( q.primary_bsec  )

Переводит в:

p.brimsec.SubString(0, q.primary_bsec.Length) == q.primary_bsec

LINQПереводчик в SQL прекрасно справляется с этим, и семантика эквивалентна StartsWith.

Честно говоря, я не понимаю, почему правильно перевести StartsWith для серверных аргументов было так сложно, что разработчики LINQ просто решили броситьошибка вместо.

0 голосов
/ 20 ноября 2010

По сути, linq в sql не знает, как конвертировать начинается с Sql. Это связано с тем, что внутренне во время выполнения ваш linq является кодом, сгенерированным для sql.

Вы можете добиться этого, создав UDF (пользовательскую функцию в sql) и используя ее из вашего оператора linq.

Статья выглядит так: http://msdn.microsoft.com/en-us/library/bb399416.aspx

Andrew

0 голосов
/ 20 ноября 2010

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что в linq-to-sql нет перевода String.StartsWith в SQL.String.Contains работает, однако - вам нужно просмотреть итоговую коллекцию и отфильтровать элементы, которые не начинаются с q.primary_bsec.

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