2009-08-22 4 views
1

Я работаю на хранилище шаблон, где API выглядеть следующим образом:Generic Repository Linq2Sql Импеданс несовпадение проблема

var visitor = repository.Find(x => x.EmailAddress == credentials.EmailAddress && 
           x.Password == credentials.Password); 

где посетитель объект домена и х представляет этот объект домена. Метод подписи метода Find на репозиторий:

T Find(Func<T, bool> query); 

Это все замечательно, пока я не пытаться использовать этот Linq2Sql, поскольку Linq2Sql создает свои собственные объекты, и в результате, когда я хочу позвонить:

context.visitors.FirstOrDefault(query); 

существует несоответствие типа, потому что Linq2Sql ожидает функцию типа оно создало и не функция Я передаю в

ответ

1

Ну, чтобы начать с вам нужно изменить Find подпись:.

T Find(Expression<Func<T, bool>> query); 

LINQ to SQL должен иметь логику как дерево выражений вместо простого делегата, иначе он не сможет решить, как перевести его в SQL.

Помимо этого, я боюсь, что это не очень понятно - похоже, что вы не используете одни и те же классы домена для своего репозитория и LINQ to SQL. Это правильно? Это звучит как потенциальная проблема; по крайней мере, это сделает жизнь довольно сложной.

+0

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

+0

Добавление поведения легко: сгенерированные классы являются * частичными классами *, что означает, что вы можете добавить свое собственное поведение в отдельный файл, но все же в том же классе. Вы можете указать доступность свойств в файле dbml. –

+0

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