2015-02-16 2 views
0

Я пытаюсь найти наиболее эффективный способ решить эту проблему:Linq Conditional Include

Я извлекаю файл из базы данных. Если FileSize меньше 10 МБ, я хочу включить FileContent, в противном случае он останется пустым. Мой код по праву сейчас:

var z = QuerySet.AsQueryable(); 

File f = z.FirstOrDefault(item => item.Id == id && item.FileSize >= 1024 * 1024 * 10); 

if (f != null) return f; 

return z.Include(a => a.FileContent) 
    .FirstOrDefault(item => item.Id == id); 

Итак, я запрашиваю, чтобы найти, если это мой файл (соответствует Id), и если это большой файл. Если это так, верните файл. В противном случае повторите запрос, но включите содержимое файла. Есть ли более эффективный способ достичь этого?

ответ

3

Как насчет:

var item = z.Select(x => new { 
     File = x, 
     Content = x.FileSize >= sizeLimit ? null : x.FileContent 
    }).FirstOrDefault(x => x.File.Id == id); 

return item.File; 

Если сделать трюк, но вы должны подтвердить, посмотрев на сгенерированного SQL.

+0

Nice, лаконичный и прекрасно работает. – hsimah