读书人

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

发布时间: 2013-01-26 13:47:04 作者: rapoo

求一条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());
}
}
}

读书人网 >.NET

热点推荐