Два способа:
Один: перетащите его из Linq2SQL в объекты Linq2Object, используя ToEnumerable()
, а затем используйте orderBirthday
на уровне C #.
Преимущество заключается в простоте кодирования иподдерживайте, недостаток в том, что может быть менее эффективным (зависит только от того, что вы делаете.
Два: написать эквивалентную функцию в SQL, скажем, она называлась dbo.orderBirthday
. MakeВаш orderBirthday
метод является нестатическим методом вашего класса, полученного из datacontext, а затем пометьте ваш метод как эквивалентный функции SQL:
[Function(Name="dbo.orderBirthday",IsComposable=true)] //IsComposable is true for functions that can be used within queries, false for stored procedures that must be called on their own.
public int OrderBirthday([Parameter(Name="@birthday",DbType="datetime") DateTime birthday)
{
return Helper.OrderBirthday(birthday); // just to show that we can keep the static version around if we want and call into it. Alternatively we could just move the whole body here.
}
Здесь код C # используется в не-Linq2SQL-контекстеи код SQL используется при составлении запроса SQL в контексте Linq2SQL.
Преимущество: может дольше оставаться в SQL. Недостаток: две версии одного и того же метода могут не синхронизироваться и вызывать ошибки.
Также возможно, чтобы код C # постоянно вызывал код SQL:
[Function(Name="dbo.orderBirthday",IsComposable=true)]
public int OrderBirthday([Parameter(Name="@birthday",DbType="datetime") DateTime birthday)
{
return (int)ExecuteMethodCall(this, (MethodInfo)MethodInfo.GetCurrentMethod(), birthday).ReturnValue;
}
Преимущество: одна версия (SQL) остается единственной версией, поэтому она не может выпастьсинхронизации с версией C #.Недостаток: вызывает SQL даже при работе с объектами, которые не имеют ничего общего с SQL.