DataContext - автоматически загружать необязательные ссылочные значения при запросах через LINQ. - PullRequest
0 голосов
/ 21 апреля 2011

У меня следующая ситуация (как пример)

У меня есть DataContext с именем: Master.dbml

У него есть 2 таблицы:

  • Hobby {id; name;}
  • HobbyReference {id; Hobby_Name; Hobby_Good_Name;}

Всегда, когда я запрашиваю Hobby, DataContext должен проверять, если (псевдокод):

 Hobby.Name EXISTS in HobbyReference.Hobby_Name
 THEN 
      take HobbyReference.Hobby_Good_Name
 ELSE 
      take Hobby.Hobby_Name
 END IF

Какая лучшая практика в этом отношении?

У меня есть представление о том, как это сделать (расширение текста данных), но я не знаю, как его полностью реализовать.

Как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2011

Если в HobbyReference никогда не бывает более одной записи для каждого имени, и если это используется для запросов (т.е. не для обновления), то вы можете сделать что-то вроде

public class AmendedHobby
{
    public int Id  { get; set ;} 
    public string Name{ get; set ;} 
}

public IQueryable<AmendedHobby>  GetAmendedHobbies()
{
    return 
     (from h in Hobby
      join hr in HobbyRefernce on h.Name equals hr.Name into hrResults
      from hr in hrResults.DefaultIfEmpty()
      select new { h.id , Name = hr.Hobby_Good.Name ?? r.Name}  
}

Это должно позволить вам выполнять такие подзапросы, как

 (from r in GetAmendedHobbies() where r.Name == "Football" select r)

Он вернет класс AmendHobby, который, поскольку он не связан с существующей таблицей, означает, что изменения не будут сохранены обратно в базу данных.

0 голосов
/ 21 апреля 2011

Hobby.Hobby_Name не существует!

В любом случае для проверки перед возвратом из текстового текста вы можете сделать следующее:

public class HobbyDataService
    {
        MasterDataContext db = null;

        public HobbyDataService(string connection)
        {
            db = new MasterDataContext(connection);
        }

        internal string GetHoppyName(string hobbyName)
        {
            var x = from hr in this.db.HobbyReferences
                    where string.Equals(hr.Hoppy_Name, hobbyName)
                    select hr;
            if (x.Any())
                return x.First().Hobby_Good_Name;
            else
            {
                //Return what ever you want here
            }
        }
    }

 public partial class Hobby
    {
        public static string GetName(string hobbyName, string connection)
        {
            if (String.IsNullOrEmpty(hobbyName))
                throw new ArgumentException("hobbyName is null or empty.", "hobbyName");
            if (String.IsNullOrEmpty(connection))
                throw new ArgumentException("connection is null or empty.", "connection");

            HobbyDataService dataSrvce = new HobbyDataService(connection);
            return dataSrvce.GetHoppyName(hobbyName);
        }
    }
...