2010-11-02 3 views
2

Я хотел бы добавить набор условных условий, где clauses на конец ObjectSet. Тем не менее, положения не получают выполнены и вместо того, чтобы исходный запрос выполняется, например:Как добавить предложение where в Entity Framework ObjectSet

using (Entities context = new Entities()){ 
var q = context.AuditLogs; 
q.Where(o => o.WebsiteId == 1); 
} 

где положение не выполняется, и полный набор результатов возвращается я мог бы вместо этого использовать IQueryable как в:

var q = context.AuditLogs.AsQueryable(); 
q = q.Where(o => o.WebsiteId == 1); 

Однако это лишает меня возможности быть в состоянии использовать. Включите, чтобы загружать мои связанные объекты.

+3

В первом примере, вы не устанавливая д к результату q.Where (о => o.WebsiteId == 1); – dotariel

+0

да, вы не можете это сделать (ну, по крайней мере, это не позволяет мне это делать), поскольку он неявно конвертирует из ObjectSet в Iqueryable – januszstabik

ответ

6

Нет, это не так. в любой момент до выполнения запроса, вы все равно будете в состоянии бросить его обратно в ObjectQuery < T> и вызывать методы, как Включите на него:

var query = context.AuditLogs.AsQueryable(); 
query = query.Where(o => o.WebsiteId == 1); 
var auditLog = ((ObjectQuery<AuditLog>)query).Include("yourNavPropertyName") 
              .ToList(); 

Если вы задумали построить критерий пошагово, то другой вариант будет использовать EntitySQL с QueryBuilder методами:

var query = context.AuditLogs.Where("it.WebsiteId = 1"); 
query = query.Where("..."); 
var auditLog = query.Include("yourNavPropertyName") 
        .ToList(); 
+0

, чтобы избежать приведения в конце, можете ли вы сделать что-то вроде context.AuditLogs.Include ("navProp") .AsQueryable(); ? Или это все равно будет выполнять весь набор результатов, а затем отфильтровать его на стороне клиента? – JoeBrockhaus

1

Просто некоторые хороший старомодный вес LINQ здесь достаточно. Предполагая, что вы имели свойство с именем владельцы сайтов вы могли бы сделать то, что вы пытаетесь сделать с ниже запроса

using (Entities context = new Entities()){ 
    var webSites = from sites in context.AuditLogs.Include("SiteOwner") 
       where sites.WebSiteId == 1 
       select sites; 
} 
+0

Извините, что это не то, что я искал, включил только работу при использовании ObjectSet, тогда как мне нужна комбинация функциональности между IQueryable и Object, как в ответе Мортезы – januszstabik

Смежные вопросы