簡體   English   中英

在沒有外鍵的情況下從實體框架中的子對象獲取父對象

[英]Get the parent object from child in entity framework without a foreign key

我負責視圖/視圖模型,而不是項目的模型。 模型設置如下:

[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; }
}

編輯

我試圖通過對Activity類進行調用來填充DataGrid。 該網格在另一類中具有“名稱”屬性的列。 如何通過ViewModel從Activity類的兩個類中獲取“名稱”列的列表(或Class對象本身的列表)?

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>

視圖模型

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

GetAll方法

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;
}

我不確定您一開始的設置是什么,但是可以使用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,您具有所需活動的列表,現在您想知道哪個Class對象包含此活動,那么您可以執行以下操作:

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);
    }

我不確定您的配置,但您可能還需要添加

using System.Data.Entity

和/或.Include(e => e.Activities)到您的查詢中。

最后,如果您是我,我將創建一個業務對象類,其中包含DataGrid所需的屬性,這些屬性不適用於db對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM