C# linq中的两个别名求和

C# linq中的两个别名求和,c#,linq,c#-4.0,C#,Linq,C# 4.0,我用linq编写这个查询,我想做这项工作 1-在“选择新”中求和x和y 2减去时间跨度和数字的倍数,例如30 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

我用linq编写这个查询,我想做这项工作 1-在“选择新”中求和x和y 2减去时间跨度和数字的倍数,例如30

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();

我将设法指导你找到正确的解决办法。 定义自定义类,不要像这样使用匿名类

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
}
然后只需将不带
z
的计算值选择到
MyClass

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

为了解决
(c.Karmand.ExitTime-c.Karmand.EnterTime).Hours*30
计算,您需要提供有关ORM的更多详细信息。解决方案将取决于。一种通用解决方案是将
ExitTime
EntertTime
提取到
MyClass
中,然后用与计算
x-y

相同的方法计算小时差,在查询中使用
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();

这看起来像是一个魔咒。@AlexanderTsvetkov很奇怪OPs经常不花时间格式化代码…你用什么
ORM
呢?tnx让它起作用,但是第二个问题呢:我有两个字段类型的时间(7),在sql中,在linq中,你知道是timespan。我想减去它们,然后乘以一个数字,例如30In():尽管CLR System.TimeSpan类型不支持加法和减法,但SQL时间类型不支持。因此,如果LINQ to SQL查询在映射到SQL时间类型时尝试进行加减运算,则会生成错误。您可以在SQL-CLR类型映射中找到处理SQL日期和时间类型的其他注意事项。也许您可以尝试不同的时间映射:tnx这是个好主意,但第二个问题如何:我有两个字段类型time(7)在sql和linq中,你知道的是timespan。我想减去它们,然后在这一行上乘以一个数字,例如30
karkard=(c.Karmand.ExitTime-c.Karmand.EnterTime).Hours*30
错误:'System.Nullable'不包含'Hours'的定义,并且找不到接受'System.Nullable'类型的第一个参数的扩展方法'Hours'(是否缺少using指令或程序集引用?)