Получить родительский объект от дочернего объекта в рамках сущности без внешнего ключа - PullRequest
0 голосов
/ 11 сентября 2018

Я отвечаю за модель просмотра / просмотра, а не за модель проекта.Модель настроена так:

[Table("Activity")]
public class Activity
{
    [Key]
    public int ActivityId { get; set; }

    public string OtherProperties { get; set; }
}

[Table("Class1")]
public class Class1
{
    [Key]
    public int Class1Id { get; set; }

    public string Name { get; set; }

    public ObservableCollection<Activity> Activities { get; set; }
}

[Table("Class2")]
public class Class2
{
    [Key]
    public int Class2Id { get; set; }

    public string Name { get; set; }

    public ObservableCollection<Activity> Activities { get; set; }
}

РЕДАКТИРОВАТЬ

Я пытаюсь заполнить DataGrid, выполнив вызов для класса Activity,В этой таблице есть столбец для свойства «Имя» в другом классе. Как получить список столбца «Имя» (или список самих объектов класса) из двух классов изКласс активности через ViewModel?

WPF

<DataGrid ItemsSource="{Binding Activities}"
          Grid.ColumnSpan="3"
          Grid.Row="1"
          HorizontalAlignment="Stretch"
          AutoGenerateColumns="False"
          >
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Complete">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Command="{Binding Path=DataContext.CompleteTaskCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:BasePage}}}"
                            CommandParameter="{Binding ActivityId}"
                            Content="{StaticResource FontAwesomeCheckIcon}"
                            Foreground="Green"
                            Grid.Column="0"
                            HorizontalAlignment="Center"
                            Style="{StaticResource FontAwesomeIconButton}"
                            VerticalAlignment="Center"
                            />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Binding="{Binding DueDate, StringFormat=MM/dd/yyyy, Converter={local:UtcToLocalDateTimeValueConverter}}" Header="Due Date"/>
        <DataGridTextColumn Binding="{Binding IsComplete, Converter={local:BooleanToStringParameterValueConverter}, ConverterParameter=CompletedOpen}" Header="Status"/>
        <DataGridTextColumn Binding="{Binding Subject}" Header="Subject"/>
        <DataGridTextColumn Binding="{Binding Name}" Header="Name"/> ??????????
    </DataGrid.Columns>
</DataGrid>

ViewModel

Activities= DB.GetAll<Activity>().Where(x => x.IsDeleted == false && x.AssignedTo == user);

GetAll Method

public IEnumerable<T> GetAll<T>() where T : EcoDevBase, new()
{
    // if no items, returns an empty list
    IEnumerable<T> entityList = _Context.Set<T>().ToList();
    return entityList;
}

1 Ответ

0 голосов
/ 12 сентября 2018

Я не уверен, какие у вас настройки с самого начала, но есть способы удовлетворить ваши требования, используя LINQ.Например:

var desiredActivity = Activity;
var class1Names = DbContext.Class1.Where(e => e.Activities.Contains(desiredActivity).Select(e => e.Name)

var class2Names = DbContext.Class2.Where(e => e.Activities.Contains(desiredActivity).Select(e => e.Name)

var listOfNames = new List<string>;

listOfNames.AddRange(class1Names);
listOfNames.AddRange(class2Names);

Возможно, это не самое оптимальное решение, но вы не предоставили столько информации о том, что вы хотите сделать со своим бизнес-объектом.

Редактировать:

Ссылаясь на вашу ViewModel, у вас есть список желаемых действий, теперь вы хотите знать, какой объект класса содержит это действие, тогда вы можете сделать:

var listOfNames = new List<string>;
foreach (var activity in Activities)
{
 var class1Names = DbContext.Class1.Where(e => e.Activities.Contains(activity).Select(e => e.Name)

    var class2Names = DbContext.Class2.Where(e => e.Activities.Contains(activity).Select(e => e.Name)

    listOfNames.AddRange(class1Names);
    listOfNames.AddRange(class2Names);
}

Теперь вы можете удалить дубликаты из listOfNames, вызвав

var fixedListOfNames = new List<string>;
fixedListOfNames.AddRange(listOfNames.Distinct());

И если вы хотите получить списки ваших объектов, вы можете сделать следующее:

 var listOfClasses1 = new List<Class1>;
var listOfClasses2 = new List<Class2>;
    foreach (var activity in Activities)
    {
     var class1Names = DbContext.Class1.Where(e => e.Activities.Contains(activity);

        var class2Names = DbContext.Class2.Where(e => e.Activities.Contains(activity);

        listOfClasses1.AddRange(class1Names);
        listOfClasses2.AddRange(class2Names);
    }

I 'Я не уверен насчет вашей конфигурации, но вам также может понадобиться добавить

using System.Data.Entity

и / или .Include(e => e.Activities) к вашим запросам.

Наконец, на вашем местеЯ бы создал класс бизнес-объектов, содержащий свойства, требуемые вашей DataGrid, чтобы они не работали с объектами БД.

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