Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我能';t使用group子句从3个表中进行Distinct、Sum或Count_C#_Linq_Distinct - Fatal编程技术网

C# 我能';t使用group子句从3个表中进行Distinct、Sum或Count

C# 我能';t使用group子句从3个表中进行Distinct、Sum或Count,c#,linq,distinct,C#,Linq,Distinct,我还在学习linq,现在我感到困惑了。我需要从3个表中获取报告数据,我得到了结果,但它是重复的。我使用了distinct,但它不起作用,我需要的数据总和仍然不起作用 这是我的桌子 TBL_MKN_MNM TBL_DETAIL TBL_TRANSACTION ID_A Name Price Stock ID_B ID_A ID_C MANY ID_C DA

我还在学习linq,现在我感到困惑了。我需要从3个表中获取报告数据,我得到了结果,但它是重复的。我使用了distinct,但它不起作用,我需要的数据总和仍然不起作用

这是我的桌子

TBL_MKN_MNM                               TBL_DETAIL                 TBL_TRANSACTION 

ID_A  Name        Price   Stock       ID_B  ID_A ID_C  MANY     ID_C   DATE      PAY   
11   pepsi       2500     15          1     11   1234  1        1234   2013-05-22  6000
22   coca-cola   3000     16          2     22   1234  1        6666   2013-05-22  10000
                                      3     11   6666  2          
                                      4     22   6666  1


the result I want
Name        MANY   PRICE   AMOUNT  LeftStock
Pepsi        3     2500    7500     12
Coca-Cola    2     3000    6000     14 

Total 13500 
这是我的问题,谁能解释一下怎么了

var report= (from u in myDb.TBL_TRANSAKSI_MKN_MNMs.AsEnumerable()
  where u.TGL_TRANSAKSI.Value.Date.Equals(dateTimePicker1.Value.Date)
  join l in myDb.TBL_DETAIL_TRANSAKSIs.AsEnumerable() on u.ID_NOTA equals l.ID_NOTA
  join m in myDb.TBL_MKN_MNMs.AsEnumerable() on l.ID_MKN_MNM equals m.ID_MKN_MNM
  group new { u, l, m } by new { m.NAMA_MKN_MNM, m.HARGA_JUAL, u.TGL_TRANSAKSI, l.ID_MKN_MNM, u.USERNAME, l.Jumlah }
  into grp                 
  select new 
  {                         
      MakanMinum = grp.Key.NAMA_MKN_MNM,
      HargaJual = grp.Key.HARGA_JUAL,
      Stok = grp.Sum(groupedthing => groupedthing.l.Jumlah), 
      Tanggal =  grp.Key.TGL_TRANSAKSI,
      Jumlah =(grp.Key.HARGA_JUAL * grp.Sum(groupedthing => groupedthing.l.Jumlah)),
      Total = grp.Sum(grouptotal => grp.Key.HARGA_JUAL * grp.Sum(groupedthing => groupedthing.l.Jumlah)),
      Username = grp.Key.USERNAME
  }).Distinct();

第一:您不应该使用anonymouse类作为查询结果

第二:您应该使用
Enumerable.Distinct方法(IEnumerable,IEqualityComparer)
而不是当前的
Enumerable.Distinct方法(IEnumerable)

见链接:

以下是我的建议:

var report= (from u in myDb.TBL_TRANSAKSI_MKN_MNMs.AsEnumerable()
  where u.TGL_TRANSAKSI.Value.Date.Equals(dateTimePicker1.Value.Date)
  join l in myDb.TBL_DETAIL_TRANSAKSIs.AsEnumerable() on u.ID_NOTA equals l.ID_NOTA
  join m in myDb.TBL_MKN_MNMs.AsEnumerable() on l.ID_MKN_MNM equals m.ID_MKN_MNM
  group new { u, l, m } by new { m.NAMA_MKN_MNM, m.HARGA_JUAL, u.TGL_TRANSAKSI, l.ID_MKN_MNM, u.USERNAME, l.Jumlah }
  into grp                 
  select new MyClass
  {                         
      MakanMinum = grp.Key.NAMA_MKN_MNM,
      HargaJual = grp.Key.HARGA_JUAL,
      Stok = grp.Sum(x=>x.l.Jumlah),  
      Tanggal =  grp.Key.TGL_TRANSAKSI,
      Jumlah =(grp.Key.HARGA_JUAL *  grp.Sum(x=>x.l.Jumlah)),
      Total = grp.Sum(grouptotal => grp.Key.HARGA_JUAL *  grp.Sum(x=>x.l.Jumlah)),
      Username = grp.Key.USERNAME
  }).Distinct(new MyClassComparer());


class MyClass
{
  public int MakanMinum {get;set;}
  pubic int HargaJual {get;set;}
  ...
}



class MyClassComparer : IEqualityComparer<MyClass>
{

    public bool Equals(MyClass x, MyClass y)
    {

        if (Object.ReferenceEquals(x, y)) return true;


        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;


        return x.MakanMinum  == y.MakanMinum  && x.HargaJual= y.HargaJual;
    }

    public int GetHashCode(MyClass m)
    {

        if (Object.ReferenceEquals(m, null)) return 0;

        return m.MakanMinum.GetHashCode()^ m.HargaJual.GetHashCode();
    }

}
var报告=(myDb.TBL\u TRANSAKSI\u MKN\u MNMs.AsEnumerable()中的u)
其中u.TGL_TRANSAKSI.Value.Date.Equals(dateTimePicker1.Value.Date)
在myDb.TBL\u DETAIL\u TRANSAKSIs.AsEnumerable()中加入l,u.ID\u NOTA等于l.ID\u NOTA
在myDb.TBL_MKN_MNMs中加入m。l.ID_MKN_MNM上的AsEnumerable()等于m.ID_MKN_MNM
组新{u,l,m}由新{m.NAMA_MKN_MNM,m.HARGA_JUAL,u.TGL_TRANSAKSI,l.ID_MKN_MNM,u.USERNAME,l.Jumlah}
玻璃钢
选择新MyClass
{                         
MakanMinum=grp.Key.NAMA_MKN_MNM,
HargaJual=grp.Key.HARGA_-JUAL,
Stok=grp.Sum(x=>x.l.Jumlah),
Tanggal=grp.Key.TGL_TRANSAKSI,
Jumlah=(grp.Key.HARGA_JUAL*grp.Sum(x=>x.l.Jumlah)),
总计=grp.Sum(grouptotal=>grp.Key.HARGA_-JUAL*grp.Sum(x=>x.l.Jumlah)),
Username=grp.Key.Username
}).Distinct(新的MyClassComparer());
类MyClass
{
公共整数MakanMinum{get;set;}
pubic int HargaJual{get;set;}
...
}
类MyClassComparer:IEqualityComparer
{
公共布尔等于(MyClass x,MyClass y)
{
if(Object.ReferenceEquals(x,y))返回true;
if(Object.ReferenceEquals(x,null)| | Object.ReferenceEquals(y,null))
返回false;
返回x.MakanMinum==y.MakanMinum&&x.hargajul=y.hargajul;
}
公共int GetHashCode(MyClass m)
{
if(Object.ReferenceEquals(m,null))返回0;
返回m.MakanMinum.GetHashCode()^m.HargaJual.GetHashCode();
}
}

“它不工作”不工作的内容。是否存在编译错误,或者您只是没有得到预期的结果?只是没有得到我预期的结果。然后请发布一些(小)示例输入、预期输出和实际输出。结果是按日期进行的事务有一个显示结果的链接。。。roti应该是3,tebs应该是2您使用的linq提供程序是什么?您应该避免使用
AsEnumerable
,因为整个表都将经过内存,
Where
过滤器不在数据库中。现在副本已删除,我如何计算?它仍然不能算数