Если вы установили свои отношения в базе данных и навигационные свойства в вашей модели (что делается генераторами), то в Linq вам редко нужны объединения (для таблиц, которые не имеют прямого отношения).
Во-вторых, вы здесь не после Sum (), не так ли?Если посмотреть на вашу функцию суммирования и имя поля, это больше похоже на то, что вы находитесь после проверки «Доступно».
var result = from i in _context.Items
group i by i.IdItem into g
select new {
IdItem = g.Key,
Name = g.First().Name,
Quantity = g.Count(),
Available = g.Any(it => it.State.IdStatus == 1)
};
РЕДАКТИРОВАТЬ: если ваша сумма была преднамеренной, то вы можете заменить Доступную часть на (этонемного, правда?):
Available = g.Sum(it => it.State.IdStatus)
РЕДАКТИРОВАТЬ: Это основано на ваших данных / модели и SQL сверху:
var result = from i in _context.Items
select new
{
i.IdItem,
i.Name,
Quantity = i.States.Count(),
Available = i.States.Count(x => x.IdStatus == 1)
};
Пример кода и результаты:
string defaultConString = @"server=.\SQLExpress;Database=SampleDb;Trusted_Connection=yes;";
void Main()
{
var _context = new MyContext(defaultConString);
var result = from i in _context.Items
select new
{
i.IdItem,
i.Name,
Quantity = i.States.Count(),
Available = i.States.Count(x => x.IdStatus == 1)
};
result.Dump(); // linqPad
}
public class MyContext : DbContext
{
public MyContext(string connectionString)
: base(connectionString)
{ }
public DbSet<Item> Items { get; set; }
public DbSet<State> States { get; set; }
}
[Table("Items")]
public partial class Item
{
public Item()
{
this.States = new List<State>();
OnCreated();
}
[Key]
public virtual int IdItem { get; set; }
public virtual string Name { get; set; }
public virtual System.DateTime ImportDate { get; set; }
public virtual System.DateTime ReturnDate { get; set; }
public virtual IList<State> States { get; set; }
partial void OnCreated();
}
[Table("States")]
public partial class State
{
public State()
{
OnCreated();
}
[Key]
public virtual int IdState { get; set; }
public virtual string SmId { get; set; }
public virtual string Number { get; set; }
public virtual int IdItem { get; set; }
public virtual int IdStatus { get; set; }
public virtual Item Item { get; set; }
partial void OnCreated();
}
Результат:
IdItem Name Quantity Available
1 Test01 3 2
2 Test02 2 1
3 Test03 1 0