Я пытаюсь выяснить, как связать вложенную коллекцию, которую я извлек с помощью EF, в элемент управления asp: ListView или asp: Repeater для веб-формы.
Используя EF, я создал следующий запрос, в котором я выбираю группу агентств и список организаций, которыми они делятся с другими агентствами.
public static ICollection<Agency> GetAllAgencies()
{
ICollection<Agency> retAgencies = null;
try
{
using (var context = new InformSecurityEntities(string.Empty))
{
// retAgencies = context.Agencies.OrderBy(a => a.AgencyName).ToList();
retAgencies = (from a in context.Agencies
.Include("SecurityDataShares1")
.OrderBy(a => a.AgencyName)
select a).ToList();
}
}
catch (Exception ex)
{
throw new Exception("Exception thrown in UserFactory.GetAllAgencies() : " + ex.InnerException + ex.Message);
}
return retAgencies;
}
Я тестировал это в консольном приложении, и оно отлично работает.В консоли я отображал свои результаты следующим образом:
private static void showAgencies()
{
var results = UserFactory.GetAllAgencies();
foreach (var item in results)
{
Console.WriteLine("Id: {0} || Name: {1}",
item.AgencyId,
item.AgencyName);
foreach (var i in item.SecurityDataShares1)
{
Console.WriteLine(i.ReceivingAgency.AgencyName);
Console.WriteLine(convertEntityToText(i.EntityId));
}
}
Console.WriteLine("enter...");
Console.ReadLine();
}
Примечание: SecurityDataShares1 - это ICollection
Что я хотел бы сделать, это взять результаты и отобразить их вформат, подобный приведенному ниже, в веб-форме:
Agency 1
Entity 1, Entity 2, Entity 3 ...
Agency 2
Entity 1, Entity 4, Entity 5 ...
Я зависаю в консольном приложении. Я могу получить доступ к вложенной коллекции и выполнить итерацию по ней, чтобы отобразить мои результаты.Я попытался использовать элемент управления повторителя с вторичным вложенным повторителем и привязать элемент управления к результатам метода.
<asp:Repeater ID="agencyListRepeater" runat="server" OnItemDataBound="mainRepeaterBound">
<ItemTemplate>
<div class="itemsRow">
<div class="column-holder">
<asp:Label CssClass="mgmtResultText" ID="lbl_AgencyName" runat="server" Text='<%# Eval("AgencyName") %>' /></div>
<br />
<div class="mgmtIndentDiv">Sharing data with the following agencies:</div>
<asp:Repeater id="nestedDataShare" runat="server">
<ItemTemplate>
<asp:Label runat="server" Text='<%# Eval("SecurityDataShares1.AgencyName") %>' />
<asp:Label runat="server" Text='<%# Eval("SecurityDataShares1.EntityId") %>' />
</ItemTemplate>
</asp:Repeater>
</div>
</ItemTemplate>
</asp:Repeater>
Код, стоящий за
if (userRole.IsSysAdmin)
{
var agencyData = UserFactory.GetAllAgencies();
if (agencyData != null || agencyData.Count > 0)
{
agencyListRepeater.DataSource = agencyData;
agencyListRepeater.DataBind();
}
else
...
Однако это не будет работать, когда SecurityDataShares1 будет нулевым.
Любые предложения или лучший подход для этого?
Заранее спасибо.