我有一个有四个组合框的表格说cbmefrom(年龄)cbmeto(年龄)cbperiod(句号类型值谎言这个“未来7天”......)和cbgender(cbgender)..
我还有一个数据网格视图(dgvreports)..
我想要做的是我填写会员详细信息,那些年龄介于20到40之间的会员以及会员资格将在接下来的8天或24天内过期或类似...
因为我写了一个我在下面指定的课程......
public static string ConvertGender(string Gender)
{
switch (Gender)
{
case "Male": return "M";
case "Female": return "F";
default: return "";
}
}
public BindingSource getmebershipexpirymembers(string gender , DateTime strtdate,DateTime enddate,DateTime min , DateTime max)
{
bs2.DataSource = null;
var membersreports = from report in eclipse.members
let dob= eclipse.members.Take(1).Select(x=>report.member_Dob).Cast<DateTime>().FirstOrDefault()
let strtdatees = eclipse.membertomships.Take(1).Select(x=>x.memberToMship_EndDate).Cast<DateTime>().FirstOrDefault()
join memtomship in eclipse.membertomships on report.member_Id equals memtomship.member_Id
into joinmemtomship from memtomship in joinmemtomship.DefaultIfEmpty()
join mshoption in eclipse.mshipoptions on memtomship.mshipOption_Id equals mshoption.mshipOption_Id
into joinmshipoption from mshoption in joinmshipoption.DefaultIfEmpty()
join membershiptypes in eclipse.mshiptypes on mshoption.mshipType_Id equals membershiptypes.mshipType_Id
into joinmembershipdifftypes from membershiptypes in joinmembershipdifftypes.DefaultIfEmpty()
join membershipstatustypes in eclipse.mshipstatustypes on memtomship.mshipStatusType_Id equals membershipstatustypes.mshipStatusType_Id
into joinmemberstatusdifftypes from membershipstatustypes in joinmemberstatusdifftypes.DefaultIfEmpty()
where (report.member_Gender.StartsWith(gender) || string.IsNullOrEmpty(gender))
&& dob >= min && dob < max
&& (strtdatees > strtdate && strtdatees < enddate)
select new
{
MemberID = report.member_Id,
Lastname = report.member_Lastname,
Firstname = report.member_Firstname,
Postcode = report.member_Postcode,
Reference = report.member_Reference,
CardNum = report.member_CardNum,
IsBiometric = report.member_IsBiometric,
DOB = report.member_Dob,
MShipType = membershiptypes.mshipType_Name,
StatusType = membershipstatustypes.mshipStatusType_Name,
EndDate = memtomship.memberToMship_EndDate
};
bs2.DataSource = membersreports;
return bs2;
}
我正在以下面提到的形式访问上面的课程......
public void Getgroupcorporatemembers()
{
int startdays = 0;
int enddays = 0;
if (cbMeperiodType.Text == membershipexpiry.type1)
{
startdays = 0;
enddays = 7;
}
if (cbMeperiodType.Text == membershipexpiry.type2)
{
startdays = 8;
enddays = 14;
}
if (cbMeperiodType.Text == membershipexpiry.type3)
{
startdays = 15;
enddays = 30;
}
if (cbMeperiodType.Text == membershipexpiry.type4)
{
startdays = 31;
enddays = 90;
}
DateTime today = DateTime.Now;
DateTime strtdate = today.AddDays(startdays);
DateTime enddate = today.AddDays(enddays);
int agefrom = Convert.ToInt32(cbMeFrom.Text);
int ageto = Convert.ToInt32(CbMeTo.Text);
DateTime max = today.AddYears(-agefrom);
DateTime min = today.AddYears(-ageto);
string gender = "";
gender = Classes.reportmembers.ConvertGender(cbMEGendertype.Text);
dgvReportMembers.DataSource = objreports.getmebershipexpirymembers(gender, strtdate, enddate, max, min);// here i am accessing the method in class
SetDgvheaders();
}
struct membershipexpiry
{
public const string type1 = "Next 7 Days";
public const string type2 = "8 - 14 Days";
public const string type3 = "15 - 30 Days";
public const string type4 = "31 - 90 Days";
}
但我在这一行收到错误...... bs2.DataSource = membersreports;
Error :Nullreference excpetion was unhandled
Object reference not set to an instance of an object.
答案 0 :(得分:0)
这可能是我最初认为的查询,而不是 bs2 变量。
字段(例如 eclipse.mshipoption )不会引发异常。
Take(1)可能无法获得结果,然后当您尝试投射结果时,它将会失败。
我试着看看这些回归:
let dob = eclipse.members.Take(1)
.Select(x => report.member_Dob)
.Cast<DateTime>()
.FirstOrDefault()
let strtdatees = eclipse.membertomships.Take(1)
.Select(x => x.memberToMship_EndDate)
.Cast<DateTime>()
.FirstOrDefault()
答案 1 :(得分:0)
我同意Yochai,最可能的问题是查询中的let语句。例如,如果存在null member_Dob,则Cast方法将抛出NullReferenceException。
Linq查询在枚举之前不会执行。数据源分配语句将枚举查询,但它不会告诉您它失败的行。尝试使用try catch块手动枚举查询,并在catch块中设置断点。这可能有助于您找到导致问题的行。
foreach (var memb in membersreports)
{
try
{
Console.WriteLine(memb.DOB);
}
catch (Exception ex)
{
//set a breakpoint here or in the try block
Console.WriteLine(ex.Message);
}
}