首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

求一条linq查询语句。该如何解决

2013-01-26 
求一条linq查询语句。评分系统,查询6月到8月所有的评分信息,包括未评或已评分数。环境Table1Table2NameNameM

求一条linq查询语句。
评分系统,查询6月到8月所有的评分信息,包括未评或已评分数。

环境

Table1              Table2
Name                 Name  Month   Score
-----------         --------------------- 
A                   A        8      35
B                   B        8      45
C                   C        8      54
                    C        7      78

期望的查询结果:
Name Month  Score
A     6      NA
A     7      NA
A     8      35
B     6      NA
B     7      NA
B     8      45
C     6      NA
C     7      78
C     8      54

注:已评分的显示分数,没有评分的显示“NA”。

不知道说清楚没,对linq不是很了解。
[解决办法]
本帖最后由 q107770540 于 2012-09-19 22:57:57 编辑

var ay=new int[]{6,7,8};

var query=from t1 in Table1
          join t2 in Table2.Where(s=>ay.Contains(s.Month))
          on t1.Name equals t2.Name into t
          from t2 in t.DefaultIfEmpty()
          from x in ay 
          orderby t2.Name,t2.Month
          select new Table2
           {
             Name=t1.Name,
             Month=x,
             Score=t2==null?"NA":t2.Score
           };

[解决办法]
楼上好像不对呀。

以下是我的,替换成Table1 和 Table2就可以了。

class CJoin
{
    class T
    {
        public string Name { get; set; }
        public int Month { get; set; }
        public string Score { get; set; }



        public static T FromString(string s)
        {
            string[] ss = s.Split(' ');

            return new T
            { Name = ss[0], Month = int.Parse(ss[1]), Score = ss[2]};
        }

        public override string ToString()
        {
            return string.Format("{0}\t{1}\t{2}", Name, Month, Score); 
        }
    }

    static void Test()
    {
        List<string> names = new List<string>();

        for (char c = 'A'; c <= 'C'; c++)
        {
            names.Add(c.ToString());
        }

        int[] months = new int[] {6, 7, 8};
        var d1 = from n in names
                from m in months
                    select new { Name = n, Month = m};

        string s = "A 8 35
[解决办法]
B 8 45
[解决办法]
C 8 54
[解决办法]
C 7 78";
        List<T> d2 = new List<T>();

        string[] ss = s.Split('
[解决办法]
');

        foreach (var n in ss)
        {
            d2.Add(T.FromString(n));
        }

        var query2 = from left in d1
                        join right in d2 on new { left.Name, left.Month }
                        equals new { right.Name, right.Month } into gp
                        from item in gp.DefaultIfEmpty()


                        select new T
                        {
                            Name = left.Name,
                            Month = left.Month,
                            Score = item == null ? "NA" : item.Score
                        };

        foreach (var t in query2)
        {
            Trace.WriteLine(t.ToString());
        }
    }
}

热点排行