我有两个表Event_Day和Event_Session,就像这样
Event_Day
Event_Day_Id(PK) Event_Id DayNo Day_Date
420 120 1 20/6/2013
421 120 2 21/6/2013
422 120 3 22/6/2013
Event_Session
Event_Session_Id(PK) Event_Id Event_Day_Id
170 120 420
171 120 420
172 120 420
173 120 421
174 120 421
175 120 421
我想通过使用Linq
比较来自这两个表的数据来检索Event_Day_Id DayNo DayDate
420 1 21/6/2013
421 2 22/6/2013
请帮我使用Linq检索数据
答案 0 :(得分:0)
您想使用Enumerable.Distinct
LINQ方法。阅读文档here。您首先要对两个表进行连接(假设您的数据集为eventSessions
和eventDays
):
var dayInfo = from sess in eventSessions
join day in eventDays
on sess.Event_Day_Id equals day.Event_Day_Id
select new { Event_Day_Id = sess.Event_Day_Id, DayNo = day.DayNo, DayDate = sess.Day_Date };
如果您不熟悉LINQ equijoins,请阅读文档here。
之后,您想使用Distinct
方法:
var uniqueDayInfo = dayInfo.Distinct();
请注意,如果您不想使用默认的相等性比较,Distinct
也会有一个带有IEqualityComparer
的重载。初始LINQ查询(初始化dayInfo
变量的查询)以对匿名类型的投影结束。匿名类型的默认相等比较在所有属性上运行默认的相等性比较。详细了解匿名类型和被覆盖的Equals
方法here。
如果所有选定的属性都很简单(ints
,DateTimes
等),这应该足以让Distinct
按需运行,而不提供可选的{{1}参数。
答案 1 :(得分:0)
如果你有一个辅助类来创建一个比较器(如下所示),你可以这样做:
var unique_session = Sessions.Distinct(
new GenComp<Event_Session>((a,b) =>
(a.Event_Id == b.Event_Id) && (a.Event_Day_Id == b.Event_Day_Id),
(a) => a.Event_Id.GetHashCode()+a.Event_Day_Id.GetHashCode()));
var result = unique_session.Join(Days,
s => new { Event_Id = s.Event_Id, Event_Day_Id = s.Event_Day_Id },
d => new { Event_Id = d.Event_Id, Event_Day_Id = d.Event_Day_Id },
(s, d) => new { Event_Day_Id = d.Event_Day_Id,
DayNo = d.DayNo,
DayDate = d.Day_Date });
这是辅助类
public class GenComp<T> : IEqualityComparer<T>
{
public Func<T, T, bool> comp { get; private set; }
public Func<T, int> hash { get; private set; }
public GenComp(Func<T, T, bool> inComp, Func<T,int> inHash)
{
comp = inComp;
hash = inHash;
}
public GenComp(Func<T, T, bool> inComp)
{
comp = inComp;
hash = null;
}
public bool Equals(T x, T y)
{
return comp(x, y);
}
public int GetHashCode(T obj)
{
return hash == null ? obj.GetHashCode() : hash(obj);
}
}
在LinqPad下运行的完整源代码测试位于:https://gist.github.com/hoganlong/5820080
返回以下内容:
注意:我建议在LinqPad.com上使用LinqPad解决这些类型的问题 - 它会摇滚。