我正在尝试过滤初始查询.我已经嵌套了包含模型的叶子.我正在尝试根据其中一个包含的属性进行过滤.例如:
using (var context = new BloggingContext())
{
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Author)
.ToList();
}
Run Code Online (Sandbox Code Playgroud)
我怎么能说呢.Where(w => w.post.Author == "me")?
我目前在我的应用程序中有这个LINQ/EF代码:
var rootCategoryItem = DatabaseContext.Categories
.Include("SubCategories")
.OrderBy(c => c.CategoryOrder)
.Single(c => c.CategoryId == 1);
Run Code Online (Sandbox Code Playgroud)
我知道在EF你不能过滤器中包含的项目着呢,我可以写一些代码LINQ过滤掉不需要的子类别...但LINQ代码将被转换成一个可怕的SQL是高度未优化.我也可以编写一个执行此操作的存储过程(并编写比LINQ更好的查询),但我真的想使用纯EF.
所以我留下了两个选项(除非有人可以看到其他选项).
第一个是遍历子类别,删除不需要的子类别:
var subCategoriesToFilter = rootCategoryItem.SubCategories.ToList();
for (int i = 0; i < subCategoriesToFilter.Count; i++)
{
if (subCategoriesToFilter[i].Deleted)
rootCategoryItem.SubCategories.Remove(subCategoriesToFilter[i]);
}
Run Code Online (Sandbox Code Playgroud)
第二种选择是在我看来:
<ul class="treeview ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion ui-widget ui-sortable ui-accordion-content-active">
@foreach (var categoryitem in Model.SubCategories.OrderBy(c => c.CategoryOrder))
{
@if(!Model.Deleted)
{
<li class="treelistitem" id="@Model.CategoryId">
<div class="ui-accordion-header ui-state-default ui-corner-all ui-accordion-icons ui-sortable-handle first">
<span class="clickable">
<span class="ui-accordion-header-icon ui-icon treeviewicon treeviewplus"></span>
<i class="glyphicon glyphicon-folder-open rightfolderpadding"></i><span class="categoryname">@Model.CategoryName</span>
</span>
</div> …Run Code Online (Sandbox Code Playgroud) 我在互联网上看到的大多数示例都将导航属性显示为任一ICollection或直接List实现。它们通常是virtual, 以启用延迟加载。
但是,当您访问此类属性时,它将在内存中加载整个集合,并且如果您在它之后有一个子查询(即object.MyListProperty.Where(...)),我注意到将为MyListProperty.
我如何避免这种情况?where如果可能,我希望list 属性之后的子句在 SQL 服务器上执行。我可以使用IQueryable导航属性吗?这种情况有什么最佳实践吗?
我有以下型号
public class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
public List<PersonRole> PersonRoles { get; set; }
}
public class RoleInDuty
{
public int roleInDutyId { get; set; }
public string Name { get; set; }
public int typeOfDutyId { get; set; }
public TypeOfDuty typeOfDuty { get; set; }
public List<PersonRole> PersonRoles { get; set; }
}
public class PersonRole
{
public int PersonId { get; set; }
public Person …Run Code Online (Sandbox Code Playgroud)