2013-03-21 23 views
0

别名我写LINQ这个查询和我想要做的这项工作在选择新 2负的时间跨度和多重 1和x和y的数量,例如30和两个LINQ

var query = 
    (from c in DB.SabtHoghoghs 
    join aa in DB.SabtHesabKarmands on c.KarmandID equals aa.KarmandID 
    select new 
     { 
      c.Karmand.FName, 
      c.BabatMah, 
      x = DB.SabtHesabKarmands.Where(q => q.BabatMah.Year == c.BabatMah.Year && 
       q.BabatMah.Month == c.BabatMah.Month && q.HesabKarmand.HesabKarmandTypeID==1) 
       .Sum(aaa => aaa.Tedad * aaa.HesabKarmand.Mablagh), 

      y = DB.SabtHesabKarmands.Where(q => q.BabatMah.Year == c.BabatMah.Year && 
       q.BabatMah.Month == c.BabatMah.Month && q.HesabKarmand.HesabKarmandTypeID == 2) 
       .Sum(aaa => aaa.Tedad * aaa.HesabKarmand.Mablagh), 

      z=y-x //how to do this(1) 

      karkard = (c.Karmand.ExitTime-c.Karmand.EnterTime).Hours *30 //how to do this(2) 

     }).Distinct(); 
+1

这看起来像一个紧箍咒。 – 2013-03-21 12:49:22

+0

@AlexanderTsvetkov这很奇怪多长时间OP不花时间格式化代码... – 2013-03-21 12:51:19

+0

你使用什么'ORM'? – 2013-03-21 12:57:39

回答

0

使用let关键字查询:

var query = 
(from c in DB.SabtHoghoghs 
join aa in DB.SabtHesabKarmands on c.KarmandID equals aa.KarmandID 
let x = DB.SabtHesabKarmands.Where(q => q.BabatMah.Year == c.BabatMah.Year && 
     q.BabatMah.Month == c.BabatMah.Month && q.HesabKarmand.HesabKarmandTypeID == 1) 
     .Sum(aaa => aaa.Tedad * aaa.HesabKarmand.Mablagh) 
let y = DB.SabtHesabKarmands.Where(q => q.BabatMah.Year == c.BabatMah.Year && 
     q.BabatMah.Month == c.BabatMah.Month && q.HesabKarmand.HesabKarmandTypeID == 2) 
     .Sum(aaa => aaa.Tedad * aaa.HesabKarmand.Mablagh) 
select new 
{ 
    c.Karmand.FName, 
    c.BabatMah, 

    X = x, 
    Y = y, 

    Z = y - x, //how to do this(1) 

    karkard = (c.Karmand.ExitTime - c.Karmand.EnterTime).Hours * 30 //how to do this(2) 

}).Distinct(); 
+0

tnx让工作,但第二个问题如何:我有两个字段类型时间(7)在SQL和LINQ,因为你知道是timespan.i想减去他们和多重播放一个数字例如30 – 2013-03-21 22:36:51

+0

在(http://msdn.microsoft.com/en-us/library/bb882662.aspx) :虽然CLR System.TimeSpan类型不支持加法和减法,但SQL TIME类型不支持。因此,如果在映射到SQL TIME类型时尝试进行加法和减法,则LINQ to SQL查询将生成错误。您可以在SQL-CLR类型映射中找到有关使用SQL日期和时间类型的其他注意事项。 – polkduran 2013-03-22 09:26:27

+0

也许你可以尝试不同的时间映射:http://msdn.microsoft.com/en-us/library/bb386947.aspx#BehaviorMatrix – polkduran 2013-03-22 09:33:02

0

我会尽力引导您找到正确的解决方案。 定义自定义类,不要使用匿名类,像这样

class MyClass 
{ 
    public string FName { get; set; } 
    public string BabatMah { get; set; } 

    public int x { get; set; } 
    public int y { get; set; } 

    public int z { get { return x - y; } } 

    public int karkard { get; set; } 

    // implement Equals and GetHashCode for correct behaviour of Distinct 
} 

然后就是选择的计算值,而不zMyClass

select new MyClass 
    { 
     FName = c.Karmand.FName, 
     BabatMah = c.BabatMah, 
     ... 

为了解决(c.Karmand.ExitTime-c.Karmand.EnterTime).Hours *30计算,您需要携带有关您的ORM的更多细节。解决方案将取决于。一个通用的解决方案是提取ExitTimeEnterTimeMyClass,然后计算时间差以同样的方式,为您计算x - y

+0

tnx这是个好主意,但第二个问题如何:我有两个字段类型的时间(7)在SQL和LINQ,因为你知道的是时间跨度。我想减去他们和多重播放一个数字,例如30这一行上'karkard =(c.Karmand.ExitTime-c.Karmand.EnterTime).Hours * 30'错误:\t **'System.Nullable '不包含'Hours'的定义并且没有扩展方法'Hours'接受类型'System.Nullable '的第一个参数可以找到(你是否缺少使用指令或程序集引用?)** – 2013-03-21 22:41:16