Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Taucher
Thema: MVVM - PropertyChanged von UserControl von anderem UserControl mitbekommen
Am im Forum: GUI: WPF und XAML

Danke für die Infos.

Zitat
Die DataTrigger können das auch, vermutlich sogar ein Stück besser.
Hast du da vielleicht ein Beispiel dafür?

Thema: MVVM - PropertyChanged von UserControl von anderem UserControl mitbekommen
Am im Forum: GUI: WPF und XAML

Hallo an alle,
ich habe mal generell die Frage, ob es denn in MVVM möglich ist, ob ein UserControl das PropertyChanged eines anderen UserControls mitbekommen kann, und das ohne Events?

Also um konkreter zu werden ein Beispiel: Ich habe eine UserControl, das ein TreeView enthält. Dieses UserControl befindet sich innerhalb eines anderen UserControls. Jetzt will ich mit dem anderen UserControl darauf reagieren, wenn sich das SelectedItem des TreeViews ändert.
Meine einzige Idee dazu jetzt wäre über Events.
Deshalb meine Frage, gibt es für das MVVM-Pattern da eine spezielle Lösung, das ich irgendwie von außen das PropertyChanged mitbekommen kann, oder müssen da wieder Events her?

Thema: Commands - woher bekomme ich die Daten aus der View
Am im Forum: GUI: WPF und XAML

Hallo Wilfried, Hallo Lukasrad02,

jetzt weiß ich wo ich falsch gedacht bzw. nicht aufgepasst habe. Ich habe nicht alle Elemente in der View an das ViewModel gebunden, sondern noch wie in Forms gedacht.
Alles klar, jetzt weiß ich bescheid. Bin mit Wpf einfach noch neu und habe noch keine Routine darin.

Danke für die schnellen Antworten!

Thema: Commands - woher bekomme ich die Daten aus der View
Am im Forum: GUI: WPF und XAML

Hallo Leute, ich schon wieder...

Ich habe jetzt mit den Commands begonnen, und habe dazu gleich eine Frage. Und zwar habe ich in meinem ViewModel ein Command eingebaut, dass soweit auch funktioniert. Aber wie komme ich jetzt aber an die Daten aus der View ran? Denn die View ist dem ViewModel ja nicht bekannt, sondern andersrum...

Wo liegt mein Denkfehler???

Thema: ListBox items aktualisieren + Focus
Am im Forum: GUI: WPF und XAML

Zitat
Ich meinte die Verwendung der Click-Methoden im CodeBehind, anstatt Commands (ICommand) mittels MVVM zu verwenden (dann wäre nämlich die gesamte Logik im ViewModel!).

Da hast du recht. Zu diesem Thema komme ich genau jetzt ;-)
Wie anfangs schon erwähnt, ich bin recht neu in Wpf und wurschtle mit schrittweise durch.
Dennoch danke für den Hinweis.

Thema: ListBox items aktualisieren + Focus
Am im Forum: GUI: WPF und XAML

Hallo Th69,

vielen Dank für deine Antwort.

Zitat
du hast eine eigenartige Mischung aus CodeBehind und MVVM, dadurch ist es (für mich) nicht ganz leicht, deinen Code zu verstehen.
Nun ja, ich hab halt mein Model, mein ViewModel und meine View. Ich denke es wäre einfacher zu lesen/verstehen, wenn es im VS anzusehen wäre.

Aber zum Problem. Ich habe es jetzt so gelöst, dass ich die Methode loadBrandItems public gemacht habe, und sie dann immer aufrufe, wenn es eine Veränderung gab. Zusätzlich musste ich in der Methode dann noch die Liste von ObservableCollection<IDisplayMemberModel> in der Methode mit Clear() "löschen".

Vielen Dank!

Thema: ListBox items aktualisieren + Focus
Am im Forum: GUI: WPF und XAML

Hallo Leute,

ich versuche mich gerade mal wieder an Wpf, und komme leider nicht weiter. Es geht darum, das die Items in meiner ListBox nicht aktualisiert werden. Ich habe da hier im Forum und über die Suchmaschine bereits Beispiele gefunden, aber leider komme ich damit nicht weiter.

Kurz zum Aufbau des Programms:
Ich habe ein MainWindow, das in 2 Hälften (links und rechts) aufgeteilt ist. Auf der linken Seite befinden sich Buttons, wo bei entsprechendem Klick, rechts ein UserControl geladen werden soll. Das funktioniert soweit bereits prima.
Das neu geladene UserControl ist wiederrum in 2 Hälften (oben und unten) aufgeteilt, wobei sich oben wieder Buttons befinden, und bei entsprechendem Klick, unten ein weiteres UserControl geladen wird. Auch das funktioniert soweit schon mal alles prima.
Allerdings fangen hier dann die Probleme schon einmal an.
Ich habe in dem UserControl das dann im unteren Bereich geladen wird, eine TextBox. Diese soll beim laden fokusiert werden, das versuche ich mit .Focus(). Der Cursor befindet sich zwar in der TextBox, allerdings blinkt er nicht, und wenn ich per Tastatur dann versuche eine Eingabe zu machen, ist die TextBox nicht fokusiert, also es tut sich nichts.

Das andere ist, ich habe in diesem UserControl auch eine ListBox, wo ich Einträge hinzufügen und löschen kann. Datenbanktechnisch werden die Einträge auch gelöscht bzw. angelegt, aber die ListBox bzw. deren Items werden dabei nicht aktualisiert.
Wie oben bereits erwähnt, komme ich jetzt hier nicht weiter und bräuchte da Hilfe dazu.

Hier mal die ganzen Klassen und xml´s dazu: (Ich weiß das es viele sind...)
Das Model mit Interface (DisplayMemberModel, IDisplayMemberModel):


public interface IDisplayMemberModel : INotifyPropertyChanged
    {
        string DisplayMember { get; set; }
        int Id { get; set; }
    }
public class DisplayMemberModel : IDisplayMemberModel
    {
        #region ... vars
        private string _displayMember;
        private int _id;
        #endregion

        #region ... properties
        public string DisplayMember
        {
            get => this._displayMember ?? string.Empty;
            set
            {
                if (this._displayMember != value)
                {
                    this._displayMember = value;
                    this.NotifyPropertyChanged("DisplayMember");
                }
            }
        }
        public int Id
        {
            get => this._id;
            set
            {
                if (this._id != value)
                {
                    this._id = value;
                    this.NotifyPropertyChanged("Id");
                }
            }
        }
        #endregion

        #region ... events
        public event PropertyChangedEventHandler PropertyChanged;
        public void NotifyPropertyChanged(string propName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
        #endregion
    }
Hier die ViewModels mit den dazugehörigen Views:


public abstract class BaseViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
public class MainWindowViewModel : BaseViewModel
    {
        #region ... vars
        private ObservableCollection<IDisplayMemberModel> _naviButtons = new ObservableCollection<IDisplayMemberModel>();
        #endregion

        #region ... constructor
        public MainWindowViewModel()
        {
            this.createNaviButtons();
        }
        #endregion

        #region ... properties
        public ObservableCollection<IDisplayMemberModel> NaviButtons
        {
            get => this._naviButtons;
            set
            {
                if(this._naviButtons != value)
                {
                    this._naviButtons = value;
                    this.OnPropertyChanged("NaviButtons");
                }
            }
        }
        #endregion

        #region ... methods
        private void createNaviButtons()
        {
            this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.overview), Id = (int)EnumIdentifier.overview });
            this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.categories), Id = (int)EnumIdentifier.categories });
            this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.product_settings), Id = (int)EnumIdentifier.product_settings });
        }
        #endregion
    }
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            //  Deklariert das ViewModel für das MainWindow
            DataContext = new MainWindowViewModel();
        }
        
        private void MenuItem_CloseClick(object sender, RoutedEventArgs e)
        {
            this.closeApplication(sender, e);
        }
        private void closeApplication(object sender, RoutedEventArgs e)
        {
            //  Routine zum Schließen der Anwendung hier einfügen
            Application.Current.Shutdown();
        }

        void naviButton_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            if (btn == null) return;
            int id;
            if (!int.TryParse(btn.Tag.ToString(), out id)) return;
            this.gvContent.Children.Clear();
            switch(id)
            {
                case 0:
                    break;
                case (int)EnumIdentifier.categories:
                    this.gvContent.Children.Add(new CtrlProductCategories());
                    break;
                case (int)EnumIdentifier.product_settings:
                    this.gvContent.Children.Add(new CtrlProductSettings());
                    break;
            }
        }
    }

<Window x:Class="ProductManagement.Wpf.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="800"
        WindowStartupLocation="CenterScreen" WindowState="Maximized">
    <Window.Resources>
        <Style x:Key="CustomGridSplitterStyle" TargetType="GridSplitter">
            <Setter Property="Background">
                <Setter.Value>
                    <SolidColorBrush>
                        <SolidColorBrush.Color>
                            <Color A="255" R="155" G="155" B="155" />
                        </SolidColorBrush.Color>
                    </SolidColorBrush>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="300px" MinWidth="300" MaxWidth="600" />
            <ColumnDefinition Width="5" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <DockPanel Grid.ColumnSpan="3" Name="dpTrv">
            <Menu DockPanel.Dock="Top">
                <MenuItem Header="_Datei">
                    <Separator />
                    <MenuItem Header="_Schließen" Click="MenuItem_CloseClick"/>
                </MenuItem>
                <MenuItem Header="_Bearbeiten">
                    <MenuItem Header="_Produkte">
                        <MenuItem Header="_Übersicht" />
                        <MenuItem Header="_Produkt erstellen" />
                    </MenuItem>
                </MenuItem>
                <MenuItem Header="_Datenbestand">
                    <MenuItem Header="_Daten synchronisieren">
                        <MenuItem Header="_Alle" />
                        <MenuItem Header="Quellen auswählen" />
                    </MenuItem>
                </MenuItem>
                <MenuItem Header="Test">
                    <MenuItem Header="Overview" />
                </MenuItem>
            </Menu>
        </DockPanel>
        <GridSplitter Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" Width="3" HorizontalAlignment="Stretch" Style="{StaticResource CustomGridSplitterStyle}">
            
        </GridSplitter>
        <DockPanel Grid.Column="2" Grid.Row="1" Name="gvContent">
            
        </DockPanel>
        <DockPanel Grid.Column="0" Grid.Row="1">
            <Grid VerticalAlignment="Top">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <StackPanel Name="naviButtonContainer">
                    <ItemsControl ItemsSource="{Binding NaviButtons}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Button Content="{Binding DisplayMember}" Tag="{Binding Id}" Click="naviButton_Click" />
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </StackPanel>
            </Grid>
        </DockPanel>
    </Grid>
</Window>


public class CtrlProductSettingsViewModel : BaseViewModel
    {
        #region ... vars
        private ObservableCollection<IDisplayMemberModel> _naviButtons = new ObservableCollection<IDisplayMemberModel>();
        #endregion

        #region ... constructor
        public CtrlProductSettingsViewModel()
        {
            this.createNaviButtons();
        }
        #endregion

        #region ... properties
        public ObservableCollection<IDisplayMemberModel> NaviButtons
        {
            get => this._naviButtons;
            set
            {
                if(this._naviButtons != value)
                {
                    this._naviButtons = value;
                    this.OnPropertyChanged("NaviButtons");
                }
            }
        }
        #endregion

        #region ... methods
        private void createNaviButtons()
        {
            this.NaviButtons.Add(new DisplayMemberModel() { DisplayMember = TextProvider.GetFormattedText(EnumIdentifier.brands), Id = (int)EnumIdentifier.brands });
        }
        #endregion
    }
public partial class CtrlProductSettings : UserControl
    {
        #region ... constructor
        public CtrlProductSettings()
        {
            InitializeComponent();
            this.DataContext = new CtrlProductSettingsViewModel();
        }
        #endregion

        #region ... methods
        
        #endregion

        #region ... events
        private void naviButton_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            if (btn == null) return;
            int id;
            if (!int.TryParse(btn.Tag.ToString(), out id)) return;
            this.UserControlContainer.Children.Clear();
            switch(id)
            {
                case (int)EnumIdentifier.brands:
                    this.UserControlContainer.Children.Add(new CtrlBrands());
                    break;
            }
        }
        #endregion
    }


<UserControl x:Class="ProductManagement.Wpf.Views.CtrlProductSettings"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ProductManagement.Wpf.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style x:Key="button" TargetType="Button">
            <Setter Property="Height" Value="125"/>
            <Setter Property="Width" Value="125"/>
            <Setter Property="HorizontalAlignment" Value="Left"/>
        </Style>
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <DockPanel Grid.Row="0" Name="buttonContainer">
            <ItemsControl ItemsSource="{Binding NaviButtons}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Button Content="{Binding DisplayMember}" Tag="{Binding Id}" Click="naviButton_Click" Style="{StaticResource button}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DockPanel>

        <DockPanel Grid.Row="1" Name="UserControlContainer">
            
        </DockPanel>
    </Grid>
</UserControl>



public class CtrlBrandsViewModel : BaseViewModel
    {
        #region ... vars
        private ObservableCollection<IDisplayMemberModel> _brands = new ObservableCollection<IDisplayMemberModel>();
        #endregion

        #region ... constructor
        public CtrlBrandsViewModel()
        {
            this.loadBrandItems(null);
        }
        #endregion

        #region ... properties
        public ObservableCollection<IDisplayMemberModel> Brands
        {
            get => this._brands;
            set
            {
                if(this._brands != value)
                {
                    this._brands = value;
                    this.OnPropertyChanged("Brands");
                }
            }
        }
        #endregion

        #region ... methods
        private void loadBrandItems(string searchString)
        {
            IList<IBrandData> brands = ProductManagement.Storage.Manager.MainProductPropertyManager.Current.GetBrands(searchString);

            foreach(IBrandData brand in brands)
            {
                this._brands.Add(new DisplayMemberModel() { Id = brand.BrandId, DisplayMember = brand.BrandName });
            }
        }
        #endregion
    }
public partial class CtrlBrands : UserControl
    {
        public CtrlBrands()
        {
            InitializeComponent();
            this.DataContext = new CtrlBrandsViewModel();
            this.txtBrandName.Focus();
        }
        private void BtnSave_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            if (btn == null) return;
            //  ToDo: Fehlermeldung anzeigen
            if (this.txtBrandName.Text == null || string.IsNullOrWhiteSpace(this.txtBrandName.Text)) return;
            MainProductPropertyManager.Current.CreateBrand(this.txtBrandName.Text);
        }

        private void BtnDelete_Click(object sender, RoutedEventArgs e)
        {
            IDisplayMemberModel brand = this.lbBrands.SelectedItem as IDisplayMemberModel;
            if (brand == null) return;
            if (this.txtBrandName.Text == null || string.IsNullOrWhiteSpace(this.txtBrandName.Text)) return;
            MainProductPropertyManager.Current.DeleteBrand(brand.Id);
        }

        private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListBox lb = sender as ListBox;
            if (lb == null) return;
            IDisplayMemberModel brand = lb.SelectedItem as IDisplayMemberModel;
            if (brand == null) return;
            this.txtBrandName.Text = brand.DisplayMember;
        }
    }


<UserControl x:Class="ProductManagement.Wpf.Views.CtrlBrands"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:ProductManagement.Wpf.Views"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="25" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <StackPanel VerticalAlignment="Top" Grid.ColumnSpan="2" HorizontalAlignment="Center">
            <Label Name="lblBrands" Content="Brands"/>
        </StackPanel>
        <DockPanel Name="dpnlViewBrands" Grid.Row="1">
            <ListBox Margin="15"
                     VerticalAlignment="Stretch"
                     ItemsSource="{Binding Brands}"
                     SelectionChanged="ListBox_SelectionChanged"
                     Name="lbBrands"
                >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <TextBlock Text="{Binding DisplayMember}" Tag="{Binding Id}" />
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
                <ListBox.Style>
                    <Style x:Name="EmptyListStyle"
                           TargetType="ListBox"
                           BasedOn="{StaticResource {x:Type ListBox}}">
                        <Style.Triggers>
                            <Trigger Property="HasItems" Value="false">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate>
                                            <TextBlock Text="Keine Einträge vorhanden" HorizontalAlignment="Center"/>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </ListBox.Style>
            </ListBox>
        </DockPanel>
        <StackPanel Name="dpnlModifyBrands" Grid.Column="1" Grid.Row="1" VerticalAlignment="Bottom">
            <TextBox Name="txtBrandName" VerticalAlignment="Bottom"/>
            <Button Name="btnSave" Content="Speichern" VerticalAlignment="Bottom" Click="BtnSave_Click" />
            <Button Name="btnDelete" Content="Löschen" VerticalAlignment="Bottom" Click="BtnDelete_Click" />
        </StackPanel>
    </Grid>
</UserControl>


Kann mir jemand sagen wo der Fehler liegt bzw. was ich falsch mache?

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

Ich danke euch allen für die Antworten! Ich werde mich morgen nochmal hinsetzen, und denke auch das es dann klappen wird, und ich dann auch hoffentlich sagen kann, wo meine Blockade lag...

@Abt

Zitat
Sorry, was Du gemacht hast ist kein Reverse Engineering sondern blind im Dunkel stochern; sorry für die direkten Worte.
Das hat mit Reverse Engineering nichts, aber auch gar nichts zutun. Nicht mal Ansatzweise.

Hier stehts, und genau das habe ich gemacht.
Reverse Enginering

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

Hm, ich versuche eine 1:n Beziehung darzustellen. Ich habe laut Doku schon gesehen, dass dort immer nur 2 Klassen verwendet werden. Für das Beispiel hier dann eben in der Mother-Klasse die Children-Collection, und dann in der Children-Klasse nochmal die Eigenschaft der Mutter.
Aber ich habe dann aber das Problem, dass wenn ich mir alle Mütter anzeigen lassen will, die als Kind, z.B. "Karin" haben, ich von der Abfrage her nicht hinkomme, die where-Klausel auf die Children-Klasse zu machen.

Wieso nehme ich 3 Klassen? Wie bereits erwähnt, habe ich mir von Entity, durch das Reverse-Enginering, die Modelle mal erstellen lassen, um zu sehen, wie die das machen. Und die nehmen da 3 Klassen. Daher die Klasse zur Normalisierung. Auch die virtuals habe ich von dort übernommen.

Ich möchte einfach die 1:n Beziehung haben, wo ich dann auch die where-Klausel auf die Children-Klasse machen kann.

In Sql ist das ja recht einfach, aber irgendwie drehe ich mich jetzt da voll im Kreis.

Das ist wahrscheinlich voll simpel, und ich renne da grad voll in die falsche Richtung...

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

So, ich denke mal dass ich einen Schritt weiter gekommen bin.
Ich habe mir die Modelle mal von Entity selbst erstellen lassen, um zu sehen wie die das machen.
Daraus habe mir folgendes Beispiel zusammengestellt:


internal class TB_Mothers
    {
        public TB_Mothers()
        {
            this.Children = new HashSet<TB_Children>();
        }
        public int MotherId { get; set; }
        public string MotherName { get; set; }
        public ICollection<TB_Children> Children { get; set; }
    }

internal class TB_MothersChildren
    {
        public int MotherId { get; set; }
        public int ChildrenId { get; set; }
        public virtual TB_Mothers Mothers { get; set; }
        public virtual TB_Children Children { get; set; }
    }

internal class TB_Children
    {
        public int ChildrenId { get; set; }
        public string ChildName { get; set; }
        public TB_Mothers Mothers { get; set; }
    }

internal class MotherChildrenContext : DbContext
    {
        public virtual DbSet<TB_Mothers> TB_Mothers { get; set; }
        public virtual DbSet<TB_MothersChildren> TB_MothersChildren { get; set; }
        public virtual DbSet<TB_Children> TB_Children { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
                optionsBuilder.UseSqlServer("server=.;database=Test;trusted_connection=true;");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TB_Mothers>
                (
                    entity => 
                    {
                        entity.HasKey(s => s.MotherId);
                        entity.ToTable("TB_Mothers");
                        entity.HasMany(s => s.Children)
                                .WithOne(s => s.Mothers);
                        entity.Property(s => s.MotherName)
                                .IsRequired()
                                .HasMaxLength(50);
                        entity.HasIndex(s => s.MotherName)
                                .HasName("UQ_TB_Mothers_MotherName")
                                .IsUnique();
                    }
                );

            modelBuilder.Entity<TB_MothersChildren>
                (
                    entity =>
                    {
                        entity.HasKey(s => new { s.MotherId, s.ChildrenId });
                        entity.ToTable("TB_MothersChildren");
                        entity.HasOne(s => s.Mothers)
                                .WithMany()
                                .HasForeignKey(s => s.MotherId)
                                .OnDelete(DeleteBehavior.ClientSetNull)
                                .HasConstraintName("FK_TB_MothersChildren_TB_Mother");
                        entity.HasOne(s => s.Children)
                                .WithMany()
                                .HasForeignKey(s => s.ChildrenId)
                                .OnDelete(DeleteBehavior.ClientSetNull)
                                .HasConstraintName("FK_TB_MothersChildren_TB_Children");
                                
                    }
                );

            modelBuilder.Entity<TB_Children>
                (
                    entity =>
                    {
                        entity.HasKey(s => s.ChildrenId);
                        entity.ToTable("TB_Children");
                        entity.Property(s => s.ChildName)
                                .IsRequired()
                                .HasMaxLength(50);
                    }
                );
        }
    }

Jetzt habe ich es geschafft, mir die Abfrage so zusammenzustellen, dass ich zumindest mal Daten bekomme. Und zwar so (eigentlich 1:1 wie in Sql):


var result = (
                                    from mothers in context.TB_Mothers
                                    join motherschildren in context.TB_MothersChildren
                                    on mothers.MotherId equals motherschildren.MotherId
                                    join children in context.TB_Children
                                    on motherschildren.ChildrenId equals children.ChildrenId
                                    select new TB_Mothers { MotherName = mothers.MotherName, MotherId = mothers.MotherId }
                                ).ToList();

Hier habe ich allerdings das Problem, das ich nicht weiß, wie ich das Laden der zugehörigen Daten mit include() integrieren kann.

Allerdings bringt mir diese Abfrage:


var result3 = context.TB_Mothers
                                    .Include(m => m.Children)
                                    .ToList();

auch nicht das gewünschte Ergebnis. Denn die ICollection Children hat keinen Eintrag obwohl welche vorhanden sind.
Laut der Doku hier: Laden zugehöriger Daten sollte es aber funktionieren.
Fehler im Modell???

Spaßeshalber habe ich dann mal versucht den Join in Lambda zu schreiben, wo es aber knallt:


var result2 = context.TB_Mothers
                                            .Join
                                            (
                                                context.TB_MothersChildren
                                                , m => m.MotherId
                                                , mc => mc.MotherId
                                                , (m, mc) => new { TB_Mothers = m, TB_MothersChildren = mc }
                                            ).Join
                                            (
                                                context.TB_Children
                                                , mc => mc.TB_MothersChildren.ChildrenId
                                                , c => c.ChildrenId
                                                , (mc, c) => new { TB_Children = c }
                                            ).ToList();

Was mache ich falsch bzw. wo liegt der Fehler?

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

Das Passwort ist natürlich nicht im Klartext abgespeichert, das versteht sich von selbst.
Ich habe nur durch das Beispiel mit den Klassen Account und AccountData versucht nachzustellen, es im EF-Core nachzustellen, auf einfache Weise, da die linq-Abfragen nicht (mehr) funktioniert haben, die ich im Ef6 verwendet habe.. Da ging ja alles Problemlos. Quasi zur Verständnis. Hat aber nicht funktioniert wie man sieht...
Ich mach mit C# seit 2008 rum, und ich weiß, das ich in einer Firma war, wo Fortbildung nur ein Traum war, und Freizeit um das zu tun, ja, da hätten wir wohl 10 Tage die Woche gebraucht...
Das ich in C# Defizite habe, das muss mir keiner sagen, den davor habe ich in PHP programmiert. Da ist das alles anders. Summa Sumarum, ist es bei mir einfach so, das ich eine Erklärung für "Doofe" brauche. Denn ich ich bin sicherlich keiner der das nicht versteht, sondern jemand, der ein realistisches Beispiel für das Problem braucht, was er einfach hat. Und die Hilfe zur Selbsthilfe, bringt mir oftmals nix.
Und ja, ich habe Druck im Nacken, wo ich mir überlege, Datenbankfunktionen zu nehmen, wenn das auch nicht zu kompliziert ist in .net core, oder eben auf vorherige Technologien zurückzugreifen.

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

Taucher

Zitat
Ich versuche eine 1:n Beziehung zu machen. Ein Account kann mehrere AccountData haben.

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

Ja, das ist so gewollt.
Ein Account kann einenn oder mehrere AccountDaten haben.

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

Jetzt versteh ich nur noch Bahnhof...
Laut dem hier: EF-Core Beziehungen
ist das doch eine 1:n Beziehung. Oder nicht?
Wie er in die Referenztabelle die Werte schreibt, ist mir allerdings noch ein Rätsel...
Muss ich dann die Referenztabelle mit anlegen?

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

Th69

Zitat
on account.AccountId equals accountData.Account.AccountId

Danke, daran lags!

witte
Zitat
Wenn du das nicht brauchst kannst du die Beziehung zu 1:n vereinfachen und dir den Tanz sparen.

Ich versuche eine 1:n Beziehung zu machen. Ein Account kann mehrere AccountData haben.
Mach ich das hier nicht??? Oh man...

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

Also, ich komme überhaupt nicht weiter. Ich habe jetzt mal versucht, das Beispiel von:
Beziehungen-EF Core
in mein Beispiel umzusetzen, und zwar folgendermaßen:


public class RelationTestContext : DbContext 
    {
        public DbSet<Account> Accounts { get; set; }
        public DbSet<AccountData> AccountDatas { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<AccountData>()
                .HasOne(accountData => accountData.Account)
                .WithMany(account => account.AccountData);

            modelBuilder.Entity<AccountData>()
                .HasKey(s => s.AccountDataId);

            modelBuilder.Entity<Account>()
                .HasKey(s => s.AccountId);
        }
    }
    public class Account
    {
        public int AccountId { get; set; }
        public string LoginName { get; set; }

        public List<AccountData> AccountData { get; set; }
    }

    public class AccountData
    {
        public int AccountDataId { get; set; }
        public string EmailAddress { get; set; }
        public int ModuleId { get; set; }

        public Account Account { get; set; }
    }

    public class EntityTest
    {
        public void MyTestMethod()
        {
            List<AccountData> accountDatas = new List<AccountData>();
            accountDatas.Add(new AccountData() { AccountDataId = 1, EmailAddress = "email1", ModuleId = 1, Account = new Account() { AccountId = 1, LoginName = "Name1", AccountData = accountDatas } });
            accountDatas.Add(new AccountData() { AccountDataId = 2, EmailAddress = "email1", ModuleId = 2, Account = new Account() { AccountId = 1, LoginName = "Name1", AccountData = accountDatas } });

            List<Account> accounts = new List<Account>();
            accounts.Add(new Account() { AccountId = 1, LoginName = "Name1", AccountData = accountDatas });

            accountDatas = new List<AccountData>();
            accountDatas.Add(new AccountData() { AccountDataId = 3, EmailAddress = "email2", ModuleId = 1, Account = new Account() { AccountId = 1, LoginName = "Name2", AccountData = accountDatas } });
            accountDatas.Add(new AccountData() { AccountDataId = 4, EmailAddress = "email2", ModuleId = 2, Account = new Account() { AccountId = 1, LoginName = "Name2", AccountData = accountDatas } });

            accounts = new List<Account>();
            accounts.Add(new Account() { AccountId = 1, LoginName = "Name2", AccountData = accountDatas });


            using (RelationTestContext context = new RelationTestContext())
            {
                var result = (
                             from account in accounts
                             join accountData in accountDatas
                             on account equals accountData.Account
                             where accountData.EmailAddress == "email2"
                             && accountData.ModuleId == 2
                             select new { Account = account }
                             ).FirstOrDefault();

                var result2 = (
                                from account in accounts
                                join accountData in accountDatas
                                on account equals accountData.Account
                                select new { Account = account }
                                ).ToList();
                
            }
        }
    }

result1 ist null, und result2 hat keine Datensätze...

Ich habe keine Ahnung was und wieso das nicht funktioniert...
Wenn jemand Lust dazu hat mir weiterzuhelfen, dann freue ich mich von ihm/ihr zu hören/lesen.

Thema: Wieso gibt es im EFCore einen Fehler auf einer Spalte ('TB_AccountId'), die es gar nicht gibt?
Am im Forum: Datentechnologien

Zitat
Hier fehlt auch ein ordentlicher Model Build über OnModelCreating um eine saubere Beschreibung zu haben

Danke, daran lags!
Zitat
Hinweis und Basics .NET / Datenbanken: man verwendet kein Datetime sondern DateTimeOffset

Hab ich noch nie gehört ;)
Aber danke, ich werde das demnächst berücksichtigen!

Thema: Wieso gibt es im EFCore einen Fehler auf einer Spalte ('TB_AccountId'), die es gar nicht gibt?
Am im Forum: Datentechnologien

Das ist ja das Problem, die Spalte gibt es nirgends!
Hier der ganze Code:


internal class LoginSystemContext : DbContext
    {
        public DbSet<TB_Account> TB_Account { get; set; }
        public DbSet<TB_LoginInformation> TB_LoginInformation { get; set; }
        public DbSet<TB_ModuleId> TB_ModuleId { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder options)
                => options.UseSqlServer("server=.;database=LoginSystem;trusted_connection=true;");
    }

internal class TB_Account
	{
		#region properties...
		public int Id { get; set; }
		public string LoginName { get; set; }
		public string Password { get; set; }
		public DateTime CDate { get; set; }
		public ICollection<TB_AccountData> AccountData { get; set; }
		public ICollection<TB_ModuleId> ModuleIds { get; set; }
		#endregion
	}

internal class TB_ModuleId
    {
        #region properties...
        public int Id { get; set; }
        public string ModuleId { get; set; }
        public string ModuleName { get; set; }
        #endregion
    }

internal class TB_LoginInformation
    {
        #region properties...
        public int Id { get; set; }
        public int AccountId { get; set; }
        public int ModuleIdId { get; set; }
        public DateTime LoginDate { get; set; }
        public DateTime LogoutDate { get; set; }
        public string SessionId { get; set; }
        #endregion
    }
Und in der Datenbank gibt es diese Spalte nicht! Deshalb bin ich auch völlig Ratlos.
Mehr Code gibt es dazu nicht...

Thema: Wieso gibt es im EFCore einen Fehler auf einer Spalte ('TB_AccountId'), die es gar nicht gibt?
Am im Forum: Datentechnologien

verwendetes Datenbanksystem: <Sql Server 2008>

Hallo Leute,
ich bin gerade dran das Entity Core Framework zu benutzen, und habe auch gleich ein Problem das ich nicht nachvollziehen kann. Und zwar bekomme ich die im Titel angegebene Fehlermeldung. Eigentlich eindeutig. Aber dieser Spaltennamen wird überhaupt nicht benutzt, und den gibt es auch nicht.
Hier noch die Methode wo der Fehler auftaucht:


public void CreateModule(string moduleId, string moduleName)
        {
            using (LoginSystemContext context = new LoginSystemContext())
            {
                TB_ModuleId module = new TB_ModuleId();
                module.ModuleId = moduleId;
                module.ModuleName = moduleName;
                
                context.TB_ModuleId.Add(module);

                using (TransactionScope scope = TransactionScopeManager.Current.BuildTransactionScope())
                {
                    context.SaveChanges();
                    scope.Complete();
                }
            }
        }

Der Fehler tritt bei context.SaveChanges() auf.
Jetzt meine Frage, wie um alles in der Welt kommt das Entity auf diesen Spaltennamen?
Es gibt zwar eine Tabelle TB_Account, aber auch dort wird der Spaltenname nicht benutzt, und den gibts da auch nicht.

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

Hallo Abt,

vielen Dank für deine ausführliche Antwort.
Wenn ich damit dann Schwierigkeiten habe, dann melde ich mich wieder.

Thema: Wie kann ich einen 1:N Datensatz im Entity Framework Core auslesen?
Am im Forum: Datentechnologien

verwendetes Datenbanksystem: <SqlServer 2008>
Hallo Leute,
ich bin gerade daran mir das Entity-Framework bei .Net Core einzuverleiben, und habe da gleich ein Problem mit einer 1:n Beziehung.
Und zwar habe ich folgende Tabellen:


TB_Account
--------------
AccountId
LoginName
Password

TB_AccountAccountData
----------------------------
AccountId
AccountDataId

TB_AccountData
---------------------
AccountDataId
EmailAddress
ModuleId
...

Meine Klasse für den DbContext sieht folgendermaßen aus:


internal class LoginSystemContext : DbContext
    {
        public DbSet<TB_Account> Accounts { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder options)
                => options.UseSqlServer("Data Source=LoginSystem.db");
    }

und die Klasse für das Account-Modell:


internal partial class TB_Account
	{
		#region properties...
		public int Id { get; set; }
		public string LoginName { get; set; }
		public string Password { get; set; }
		public ICollection<TB_AccountData> AccountData { get; set; }
		#endregion
	}

Wenn ich das hier: Erste Schritte mit EF Core richtig verstanden habe, dann reicht die ICollection aus, um auf die Werte einer 1:n Beziehung zugreifen zu können.
Jetzt weiß ich nicht wie ich das machen kann, um einen mir einen Datensatz anzeigen zu lassen wo folgende Kriterien erfüllt sein müssen:
-> LoginName und EmailAddress und ModuleId
vorhanden sind.
Wenn ichs richtig gelesen habe, dann brauche ich dafür den Join-Ausdruck, aber ich weiß nicht genau wie ich das Anstellen soll.
Kann mir da bitte jemand in meinem Beispiel helfen? Dann verstehe ich das wahrscheinlich auch besser als mit ähnlichen Beispielen die man so findet.

Thema: Programm hängt und kommt auch an keinem Haltepunkt mehr an
Am im Forum: GUI: WPF und XAML

@Abt:

Zitat
Problem bei Deim Code ist halt auch, dass Du quasi alles irgendwie miteinander verwurstelt hast, statt den Code sauber zu trennen und sauber asynchron umzusetzen.
[Artikel] Drei-Schichten-Architektur
Und wegen der sehr sauberen Umsetzung hast Du Dir selbst Race Condition-Fallen gebaut.

Ich denke schon das ich eine 3-Schichten Architektur habe, denn die Datenbankabfragen, Einträge usw. liegen in einem separatem Projekt. Sind also völlig unabhängig vom Modul was darauf zugreifen will.
Zitat
Edit: mir ist aufgefallen, dass Du WPF verwendest.
Ja, ich verwende hier WPF, weil ich das einfach nur zum testen für die Datenbankebene verwenden wollte anstatt mir eine Internetseite dafür zu schreiben (Mein Schwerpunkt ist die Webentwicklung). Weil das einfach schneller geht. Denn mit WPF habe ich nicht wirklich viel gemacht und wollte das einfach auch verbinden um da ein bisschen mehr reinzukommen in WPF (Hat wohl nicht geklappt ;-) ) Deshalb auch keine Datenbindung.
Deshalb auch kein Testprojekt a la Unittest.

Danke schon mal für eure Hilfe und eure Ratschläge.

Thema: Programm hängt und kommt auch an keinem Haltepunkt mehr an
Am im Forum: GUI: WPF und XAML

Ok, danke. Da werde ich dann mal nachsehen.

Ich habe die Aufrufe in Threads gelegt, weil ansonsten das Problem auftaucht das die Oberfläche nicht aktualisiert wird, das Fenster quasi hängt. Und da kam dann auch eine Fehlermeldung (ich weiß nicht mehr wie die war), und nach ner Runde googeln kam ich dann auf einen Beitrag von diesem Forum, das man Threads dafür verwenden soll. Deshalb. Ist das falsch?

Und das mit dem case 2 ist ein Schreibfehler von mir, stimmt. Is grad aber nicht so schlimm da die Methode dazu in der Methode "databaseimport" noch nicht aufgerufen wird.

Thema: Programm hängt und kommt auch an keinem Haltepunkt mehr an
Am im Forum: GUI: WPF und XAML

Hallo Leute,
ich habe ein Problem mit meinem Programm wo ich etwas Ratlos bin.

Also, ich habe eine Datenbank die ich mit Stadtnamen füllen will. Dies mache ich mittels einem Dateiimport.
Aber es scheint so als hängt sich das Programm nach kurzem auf und ich weiß leider nicht wieso. Haltepunkte werden dann auch nicht mehr erreicht, egal wo ich sie setze.
Kann sich jemand mal den Code ansehen und findet vielleicht den Fehler, oder kann einen Verdacht äußern. Danke schon einmal.
Ich stelle den Code für die Methoden so rein wie sie der Reihe nach Ablaufen.


try
            {
                string line;
                string[] splitted;
                List<string> imported = new List<string>();
                List<object> temp;
                Thread th;
                using (StreamReader sr = new StreamReader(this.txtFilePath.Text, Encoding.Default))
                {
                    int i = 0;
                    while(sr.Peek() ≥ 0)
                    {
                        temp = new List<object>();
                        line = sr.ReadLine();
                        splitted = line.Split(',');
                        if(splitted != null && splitted.Length == 2)
                        {
                            switch(kindOfImport)
                            {
                                case 0:
                                    //  1 = Stadt
                                    if (imported.Where(s => s == splitted[1]).FirstOrDefault() == null)
                                    {
                                        temp.Add(Import.kindOfImport.city);
                                        temp.Add(splitted);
                                        th = new Thread(this.databaseimport);
                                        th.Start(temp);
                                        imported.Add(splitted[1]);
                                    }
                                    i++;
                                    break;
                                case 1:
                                    //  1 = Bundesland
                                    if (imported.Where(s => s == splitted[1]).FirstOrDefault() == null)
                                    {
                                        temp.Add(Import.kindOfImport.state);
                                        temp.Add(splitted);
                                        th = new Thread(this.databaseimport);
                                        th.Start(temp);
                                        imported.Add(splitted[1]);
                                    }
                                    i++;
                                    break;
                                case 2:
                                    //  0 = plz
                                    if (imported.Where(s => s == splitted[1]).FirstOrDefault() == null)
                                    {
                                        temp.Add(Import.kindOfImport.city);
                                        temp.Add(splitted);
                                        th = new Thread(this.databaseimport);
                                        th.Start(temp);
                                        imported.Add(splitted[0]);
                                    }
                                    i++;
                                    break;
                            }
                        }
                        this.lblImportStatus.Content = i.ToString();
                    }
                }
                MessageBox.Show("Import erfolgreich abgeschlossen.");
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


private void databaseimport(Object obj)
        {
            List<object> l = (List<object>)obj;
            Import.kindOfImport kind = (kindOfImport)l[0];
            string[] splitted = (string[])l[1];
            switch(kind)
            {
                case Import.kindOfImport.city:
                    CityManager.Current.Add(splitted[1], true);
                    break;
                case Import.kindOfImport.state:
                    StateManager.Current.Add(splitted[1], true);
                    break;
                case Import.kindOfImport.zipCode:
                    break;
            }
        }


public void Add(string cityName, bool ignoreExisting)
        {
            CityProvider.Current.Add(cityName, ignoreExisting);
        }


public void Add(string cityName, bool ignoreExisting)
        {
            this.Add(new List<string>() { cityName }, ignoreExisting);
        }


public void Add(IList<string> cityNames, bool ignoreExisting)
        {
            if (cityNames == null) throw new ArgumentNullException("Invalid city names.");
            if (cityNames.Count() == 0) return;

            using (ZipCodeEntities context = new ZipCodeEntities())
            {
                foreach(string city in cityNames)
                {
                    var temp = context.TB_City.Where(s => s.Name.ToLower() == city.ToLower()).FirstOrDefault();
                    if (temp != null && !ignoreExisting) throw new ArgumentException("Invalid city name. City name already exists.");
                    else if (temp != null && ignoreExisting) continue;

                    context.TB_City.Add(new TB_City() { Name = city });

                    using (var scope = TransactionScopeManager.Current.BuildTransactionScope())
                    {
                        context.SaveChanges();
                        scope.Complete();
                    }
                }
            }
        }

Thema: Wie HTML Tags in ASP.NET View richtig darstellen?
Am im Forum: Web-Technologien

Danke!

Thema: Wie HTML Tags in ASP.NET View richtig darstellen?
Am im Forum: Web-Technologien

Hallo Gemeinde,

ich habe heute mein erstes MVC-Projekt in VS 2013 erstellt, und habe gleich zu Beginn eine Frage dazu.
Ich habe bisher nur mit MVC 1 und 2 gearbeitet, und habe mir dafür eigene Klassen erstellt die mir dort das Leben leichter machten.
Unter anderem habe ich auch Tags über diese Klasse in die Views geschrieben wie z.B. den Title-Tag.
Jetzt hab ich bei MVC 4 das Problem, das er mir die Klammern maskiert. Also anstatt:

<title>blubb</title>
bringt er mir jetzt einen maskierten String:
&lt;title&gt;Startseite&lt;/title&gt;

Wie kann ich das ändern?

Thema: Fehler bei Authentifizierung, da die Gegenseite den Transportstream geschlossen hat.
Am im Forum: Web-Technologien

Hallo Abt,

du hast recht, ich habe den Codeabschnitt von Stackoverflow um es einfach zu versuchen.
Ich bin ein paar Jahre aus der Übung und verwende noch VS 2010, da ich mit der neuen MVC-Struktur von MVC 4 nicht vertraut bin und auch nicht die Zeit habe mich da reinzuwurschteln. In VS 2010 müsste ja das Framework 4.5 verwendet werden, oder nicht?
Was heißt: "volle Kontrolle"?
Ich muss "nur" bestimmte Teilabschnitte aus der Seite holen und ggf. ein Formular abschicken und dessen Inhalt dann eben weiter auswerten.

Thema: Fehler bei Authentifizierung, da die Gegenseite den Transportstream geschlossen hat.
Am im Forum: Web-Technologien

Hallo Gemeinde,

ich versuche mich daran, einfach eine Seite mittels Webrequest abzurufen und bekomme oben genannten Fehler, und ich weiß nicht wie ich ihn beheben kann.
Natürlich habe ich auch schon im Internet geschaut, komme aber dennoch nicht weiter.
Liegt es vielleicht an der Seite selbst wo ich aufrufen will? Denn wenn ich google.de aufrufe funktioniert es einwandfrei.
Hier der Code:


HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://rb113458.berge-meer.de/");
            //HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.google.de/");
            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls;
            ServicePointManager.ServerCertificateValidationCallback += (sender, cerificate, chain, errors) 
                => 
                { 
                    
                    return errors == SslPolicyErrors.None; 
                };
            
            request.Credentials = CredentialCache.DefaultCredentials;
            
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Thema: Linq Join Inner Join als lambda Ausdruck
Am im Forum: Datentechnologien

Hallo Abt und danke für die Antwort.
Wie sich herausgestellt hat war mein Problem ganz einfach umzusetzen, es lag schlicht weg daran dass ich zu wenig mit linq gemacht habe, so dass ich vergessen hatte das ich ohne joins auf die Beziehungstabellen zugreifen kann... Aber jetzt weiß ichs ja und merke mir das auch ;-)

Thema: Linq Join Inner Join als lambda Ausdruck
Am im Forum: Datentechnologien

verwendetes Datenbanksystem: SqlServer 2008
Hallo Gemeinde,
ich brauche mal bitte Hilfe um eine Sql-Abfrage in linq umzusetzen.
Hier die Sql-Abfrage:


Select * From TB_TattooStudio as ts
	Inner Join TB_Address as a
		On ts.AddressId = a.AddressId
	Left Outer Join TB_City as c
		On a.CityId = c.CityId
Hier mein Versuch wo ich nicht weiter komme:


context.TB_TattooStudio
                        .Join
                        (
                            context.TB_Address
                            , ts => ts.AddressId
                            , a => a.AddressId
                            , (ts, a) => TattooStudio.Create(ts.TattooStudioId, ts.Name, ts.Manager, ts.ContactId, ts.IsTattooStudio, ts.IsPiercingStudio, ts.IsLocked, ts.IsDeleted, ts.AddressId)
                        )
                        .GroupJoin
                        (
                            context.TB_City
                            , temp => temp
                            , c => c
                            , (c, temp) => new { city = c, ts = temp }
                        )
                        .ToArray();
Hier die Datenbankstruktur:
TB_TattooStudio
AddressId
...

TB_Address
AddressId
CityId
...

TB_City
CityId
...

Ich hoffe die Informationen reichen aus.