Сопоставление свойств Linq to SQL с таблицей
Допустим, у меня есть база данных с 2 таблицами: User(Id, Name, PetId,...) и Pet(Id, Name, Color,...) и этот класс:
class UserPet
{
// User table, generated in dbml
public User User {get;}
// Pet table, generated in dbml
public Pet Pet {get;}
public UserPet(User user, Pet pet)
{
User = user;
Pet = pet;
}
[...]
}
Я пытаюсь сделать ссылку на метод SQL с фильтром, как
public UserPet[] Get(Expression<Func<UserPet, bool>> criteria)
{
[...]
// System.NotSupportedException: 'The member 'User' has not supported translation to sql'
return (from user in context.User
join pet in context.Pet on usr.PetId equal pet.Id
--> select new UserPet(user, pet).Where(criteria).ToArray()
}
Так что, например, я могу сделать запрос с динамической фильтрацией:
Get(userPet => userPet.Pet.Color == "Red" && userPet.User.Name == "Dave")
Здесь критерием является объект, содержащий 2 таблицы, и я пытаюсь использовать его в методе linq to sql. Любая идея? Как сказать Linq To SQL, что свойства UserPet - это таблицы, которые были созданы в dbml?
Спасибо!
1 ответ
Решение
Через некоторое время я обнаружил, что приведенная ниже модификация работает (удалите конструктор с параметром из UserPet). Зачем? Тайна!
UserPet:
class UserPet
{
public User user {get;set;}
public Pet pet {get;set}
}
И метод:
public UserPet[] Get(Expression<Func<UserPet, bool>> criteria)
{
[...]
return (from user in context.User
join pet in context.Pet on usr.PetId equal pet.Id
select new UserPet(){User = user, Pet = pet}).Where(criteria).ToArray()
}