LINQ - Группировать с помощью SUM IF - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь написать в linq что-то, что легко (для меня) в SQL.Любая идея, как сделать что-то вроде этого:

select Items.IdItem, 
       Items.Name, 
       count(1) as Quantity, 
       SUM(IF(State.IdStatus=1,1,0)) as Availible  
from Items 
       inner join State 
              on Items.IdItem=State.IdItem 
group by Items.IdItem

Я написал что-то вроде этого:

var result = from items in _context.Items 
             join state in _context.State on items.IdItem equals State.IdItem 
             group items by { items.IdItem, items.Name } into g 
             select new { Name= g.Key.Name, IdItem=g.Key,IdItem, Quantity=g.Count(), Availible= ???? }

Любые советы?

1 Ответ

0 голосов
/ 19 сентября 2019

Если вы установили свои отношения в базе данных и навигационные свойства в вашей модели (что делается генераторами), то в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...