Да. Однако необходимо создать функцию SQL-сервера сначала и вызов, что, поскольку по умолчанию LINQ будет использовать подобное.
Этот сообщение в блоге , который объяснит деталь, но это - извлечение:
Для получения это работающий Вас должно создать табличную функцию, которая делает не что иное как запрос CONTAINSTABLE на основе ключевых слов, в которых Вы передаете,
create function udf_sessionSearch (@keywords nvarchar(4000)) returns table as return (select [SessionId],[rank] from containstable(Session,(description,title),@keywords))
Вы тогда добавляете эту функцию к своей модели LINQ 2 SQL, и он престо можно теперь записать запросы как.
var sessList = from s in DB.Sessions join fts in DB.udf_sessionSearch(SearchText) on s.sessionId equals fts.SessionId select s;
Это действительно зависит от архитектуры вашего приложения, но вот как я это делаю с помощью Prism.
Во-первых, я хочу сказать, нормально иметь ссылку на вашу виртуальную машину Представление, пока оно не является конкретной реализацией Представления, то есть ссылками по интерфейсу.
Я объединяю Представление и Модель Представления, используя внедрение зависимостей, очень похоже на то, как это делается в StockTraderRI. Итак, у меня есть IView и IViewModel. IViewModel имеет свойство под названием "View" типа IView.
На уровне кода (для меня обычно контроллер ... см. StockTraderRI), который работает с вашими регионами, добавьте механизм для удаления вашего представления из региона.
12147] Например:
myRegion.Remove(myIViewModel.View);
Если регионы обрабатываются контроллером, вы можете захотеть поместить простое событие в виртуальную машину, чтобы уведомлять, когда виртуальная машина хочет быть «закрытой». Вы также можете поэкспериментировать с IEventAggregator, если хотите использовать слабую модель обработки событий. Если регион обрабатывается в виртуальной машине, просто добавьте туда этот код.
Поскольку ваша ViewModel
не имеет (и не должна) иметь ссылку на View
, вы не можете закрыть его напрямую. Однако вы можете добавить событие
в свою ViewModel
, чтобы указать, что оно хочет быть закрытым.
Джош Смит написал статью , показывающую как это сделать (примерно в середине статьи).
Вот как выглядит мой модуль входа в систему:
public class LoginModule : IModule
{
private readonly IUnityContainer container;
public LoginModule(IUnityContainer container)
{
this.container = container;
}
#region IModule Members
public void Initialize()
{
this.container.RegisterType<ILoginController, LoginController>(new ContainerControlledLifetimeManager());
this.container.RegisterType<ILoginView, LoginView>();
this.container.RegisterType<ILoginViewModel, LoginViewModel>();
ILoginController controller = this.container.Resolve<ILoginController>();
controller.Run();
}
#endregion
}
Это контроллер:
public class LoginController : ILoginController
{
private readonly IRegionManager regionManager;
private readonly ILoginViewModel model;
public LoginController(IRegionManager regionManager, ILoginViewModel model)
{
this.regionManager = regionManager;
this.model = model;
model.RequestClose += new EventHandler(model_RequestClose);
}
void model_RequestClose(object sender, EventArgs e)
{
regionManager.Regions["LoginRegion"].Remove(model.View);
}
#region ILoginController Members
public void Run()
{
// Register views here
regionManager.Regions["LoginRegion"].Add(model.view);
}
#endregion
}
А это моя ViewModel:
public class LoginViewModel : ViewModelBase, ILoginViewModel
{
IEventAggregator _eventAggregator;
RelayCommand _loginCommand;
private readonly UserProfileRepository _userProfileRepository;
public event EventHandler RequestClose;
public ICommand LoginCommand
{
get
{
if (_loginCommand == null)
{
_loginCommand = new RelayCommand(
param => this.Login(),
param => this.IsValid());
}
return _loginCommand;
}
}
public LoginViewModel(IEventAggregator eventAggregator, UserProfileRepository userProfileRepository, ILoginView view)
{
this._eventAggregator = eventAggregator;
this._userProfileRepository = userProfileRepository;
this.View = view;
}
#region ILoginViewModel Members
public ILoginView View { get; private set; }
#endregion
}