Как получить только значения из одной коллекции, если их внешний ключ существует в другой таблице - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть две таблицы в моей базе данных.Один исполнитель, содержащий идентификатор и имя исполнителя, вторая таблица альбомов, содержащая внешний ключ artistid.Я соединил два комбо-бокса так, чтобы на каждого исполнителя показывались только их альбомы.Это работает.У меня есть trackviewmodel для добавления треков.Но у меня есть имя исполнителя в моей первой таблице, в которой еще нет альбома, и когда я выбираю этого исполнителя из выпадающего списка, я получаю нулевое исключение (объект не установлен).Как я могу заполнить первых художников комбинированного списка только тогда, когда во второй таблице существует этот artistid.На мой взгляд, я связываюсь с коллекцией Artists, поэтому имеет смысл извлечь все значения из коллекции, но я хочу только те, где artistid существует в коллекции альбомов.

Извините за длинный пост, я впервые задаю здесь вопрос, но я действительно застрял.Заранее спасибо за помощь

это для c #, шаблон mvvm, структура сущностей.Я уже пробовал это, но не могу понять, как подключить это к первому комбинированному списку:

public ICollection<Album> AlbumWithArtist()    
        {     
        return context.Albums.Where(p => p.ArtistId >= 1 && p.ArtistId.HasValue).ToArray();     
        }     

//Dataclasses    
public class Artist    
    {    
        public int Id { get; set; }    
        public string ArtistName { get; set; }     
        public ICollection<Album> Albums { get; set; }    
    }     
public class Album    
    {    

        public int Id { get; set; }    
        public Artist Artist { get; set; }    
        public virtual int? ArtistId { get; set; }    
        public string AlbumName { get; set; }    
        public Genre Genre { get; set; }     
        public virtual int? GenreId { get; set; }     
        public int NumberOfTracks { get; set; }    
    }

//TrackViewModel    
    public class TrackViewModel : ViewModel    
    {     
        private List<Artist> _artists;      
        private Artist _selectedArtist = new Artist();     
        private Album _selectedAlbum = new Album();     
        private readonly BusinessContext context;     
        private ICollection<Track> _tracks;     
        private int _trackNumber;     
        private string _trackName;

        public TrackViewModel() : this(new BusinessContext())
        {

        }

        public TrackViewModel(BusinessContext context)
        {
            this.context = context;
            this.Artists = new List<Artist>();
            this.Albums = new CustomObservableCollection<Album>();
            Tracks = new ObservableCollection<Track>();
            GetArtistList();
            GetAlbumByArtist();

        }

        private bool _uploaded = false;

        public bool Uploaded
        {
            get { return _uploaded; }
            set { _uploaded = value; }
        }

        public ICollection<Track> Tracks
        {
            get { return _tracks; }
            set { _tracks = value; }
        }

        public List <Artist> Artists
        {
            get
            {
                return _artists;
            }

            set
            {
                _artists = value;

            }
        }

        public Artist SelectedArtist
        {
            get
            {
            return _selectedArtist; 
            }
            set
            {
                _selectedArtist = value;
                this.Albums.Repopulate(_selectedArtist.Albums);
            }
        }

        public Album SelectedAlbum
        {
            get
            {
                    return _selectedAlbum;
            }
            set
            {
                _selectedAlbum = value;
                NotifyPropertyChanged("SelectedArtist");
            }
        }

        public int TrackNumber
        {
            get { return _trackNumber; }
            set { _trackNumber = value; }
        }

        public string TrackName
        {
            get { return _trackName; }
            set { _trackName = value; }
        }

        public ActionCommand AddTrackCommand
        {
            get
            {
                return new ActionCommand(p => AddTrack());

            }
        }

        private void AddTrack()
        {
            using (var api = new BusinessContext())

            {
                var track = new Track
                {

                    ArtistId = SelectedArtist.Id,
                    AlbumId = SelectedAlbum.Id,
                    TrackNumber = TrackNumber,
                    TrackName = TrackName,
                    Uploaded = Uploaded
                };
                try
                {
                    api.AddTrack(track);
                }
                catch (NotSupportedException)
                {
                    throw new NotSupportedException();

                }

                Tracks.Add(track);
            }
        }

        private void GetArtistList()
        {
            Artists.Clear();
            foreach (var ar in context.GetArtistList())
                Artists.Add(ar);
        }

        private void GetAlbumList()
        {
            Albums.Clear();
            foreach (var al in context.GetAlbumList())
                Albums.Add(al);
        }

        private void GetAlbumByArtist()
        {
            Albums.Clear();

            foreach (var al in context.AlbumWithArtist())
                Albums.Add(al);
        }

    }
//Class CustomObservableCollection<T>    

    public class CustomObservableCollection <T>: ObservableCollection <T>
    {
        public CustomObservableCollection() : base()
        {

        }

        public CustomObservableCollection(IEnumerable<T> collection) : base (collection)
        {

        }

        public CustomObservableCollection(List<T> list) :base(list)
        {

        }

        public void Repopulate(IEnumerable<T> collection)
        {
            this.Items.Clear();
            foreach (var item in collection)
                this.Items.Add(item);

            this.OnPropertyChanged(new PropertyChangedEventArgs("Count"));
            this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
            this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }
    }

//TrackView simplified   

    <Grid>
        <StackPanel Margin="20">
            <Label>Artist</Label>
            <ComboBox ItemsSource="{Binding Artists}" DisplayMemberPath="ArtistName" SelectedValuePath="ArtistId" SelectedItem="{Binding SelectedArtist}">

            </ComboBox>
            <Label>Album</Label>
            <ComboBox ItemsSource="{Binding Albums}" DisplayMemberPath="AlbumName" SelectedItem="{Binding SelectedAlbum}">
            </ComboBox>
            <Label>TrackNumber</Label>
            <TextBox Text="{Binding TrackNumber}">

            </TextBox>
            <Label>TrackName</Label>
            <TextBox Text="{Binding TrackName}">
            </TextBox>
            <CheckBox IsChecked="{Binding Uploaded}">

            </CheckBox>
            <TextBlock>
                <Hyperlink Command="{Binding AddTrackCommand}">Add Track</Hyperlink>
            </TextBlock>

        </StackPanel>

    </Grid> 

1 Ответ

0 голосов
/ 28 декабря 2018
context.Artists.Where(artist => artist.Albums.Any())

должен сделать трюк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...