2011-05-10 75 views
0
var src = (from s in Db.VCT_SITEs 
         join spl in Db.VCT_SPONSOR_SITE_PRO_LINKINGs on s.SITE_ID equals spl.SITE_ID 
         join l in Db.VCT_SITE_LOCATIONs on spl.LOCATION_ID equals l.LOCATION_ID 
         join spd in Db.VCT_SITE_PROTOCOL_DETAILs on spl.PR_SPONSOR_ID equals spd.PR_SPONSOR_ID 
         join c in Db.VCT_CONTACTs on spd.ADMINISTRATOR_ID equals c.CONTACT_ID 
         where c.FIRST_NAME.StartsWith(txtFirstName.Text.Trim()) && 
         c.LAST_NAME.StartsWith(txtLastName.Text.Trim()) && 
         s.SITE_NAME.Contains(txtSiteName.Text.Trim()) && 
         spl.PROTOCOL_ID==Convert.ToInt32(ddlProtocol.SelectedValue) && 
         l.LOCATION_ID==Convert.ToInt32(ddlLocation.SelectedValue) 
         select new 
            { 
             NAME=c.FIRST_NAME + " " + c.MIDDLE_NAME + " " + c.LAST_NAME, 
             s.SITE_ID, 
             l.LOCATION_NAME, 
             s.PHONE, 
             s.FAX, 
             s.SITE_NAME, 
             s.EMAIL_ID, 
             s.IS_ACTIVE 
          }).AsQueryable(); 

我有这个linq查询。实际上问题是条件where子句r可选的意思是这些是搜索条件。它们可能包含值或不包含。所以我必须进行检查,如果(ddlProtocol.selectedIndex!= 0)然后spl.PROTOCOL_ID == Convert.ToInt32(ddlProtocol.SelectedValue)条件工作,否则不工作。如何做到这一点linq中where子句的问题

回答

0

使用的编程语言来构建查询。

IQueryable<VCT_Contact> cQuery = Db.VCT_CONTACTs; 
string firstName = txtFirstName.Text.Trim(); 
if (firstName != string.Empty) 
{ 
    cQuery = cQuery.Where(c => c.FIRST_NAME.StartsWith(firstName)); 
} 
string lastName = txtLastName.Text.Trim(); 
if (lastName != string.Empty) 
{ 
    cQuery = cQuery.Where(c => c.LAST_NAME.StartsWith(lastName)); 
} 

IQueryable<VCT_SITE> sQuery = Db.VCT_SITEs; 
string siteName = txtSiteName.Text.Trim(); 
if (siteName != string.Empty) 
{ 
    sQuery = sQuery.Where(s => s.SITE_NAME.Contains(siteName)); 
} 
IQueryable<VCT_SPONSOR_SITE_PRO_LINKING> splQuery = Db.VCT_SPONSOR_SITE_PRO_LINKINGs; 
int protocol = Convert.ToInt32(ddlProtocol.SelectedValue); 
if (protocol != 0) 
{ 
    splQuery = splQuery.Where(spl => spl.PROTOCOL_ID == protocol); 
} 
IQueryable<VCT_SITE_LOCATION> lQuery = Db.VCT_SITE_LOCATIONs; 
int location = Convert.ToInt32(ddlLocation.SelectedValue); 
if (location != 0) 
{ 
    lQuery = lQuery.Where(l => l.LOCATION_ID == location); 
} 

var src = (
    from s in sQuery 
    join spl in splQuery on s.SITE_ID equals spl.SITE_ID 
    join l in lQuery on spl.LOCATION_ID equals l.LOCATION_ID 
    join spd in Db.VCT_SITE_PROTOCOL_DETAILs on spl.PR_SPONSOR_ID equals spd.PR_SPONSOR_ID 
    join c in cQuery on spd.ADMINISTRATOR_ID equals c.CONTACT_ID 
    select new { 
    NAME=c.FIRST_NAME + " " + c.MIDDLE_NAME + " " + c.LAST_NAME, 
    s.SITE_ID, 
    l.LOCATION_NAME, 
    s.PHONE, 
    s.FAX, 
    s.SITE_NAME, 
    s.EMAIL_ID, 
    s.IS_ACTIVE 
    }).AsQueryable(); 
+0

感谢上面的解决方案。我想再次感谢 – Pankaj 2011-05-11 04:31:30

0

做转换到一个变量查询之前:

int protocolId = int.Parse(ddlProtocol.SelectedValue); 

var src = from ... 
where spl.PROTOCOL_ID==protocolID 
    ... 
select ...; 
+0

其实我的问题不是这个。查询工作正常,如果我把这些条件,如if(ddlProtocol.selectedIndex!= 0 && ddlProtocol.SelectedIndex!= 0)。我的问题是,如果我在搜索过程中没有从下拉列表中选择任何内容,那么上面的查询在没有应用这个if(ddlProtocol.selectedIndex!= 0 && ddlProtocol.SelectedIndex!= 0)的情况下工作。 – Pankaj 2011-05-10 11:36:51

+0

你可以在where子句中做到这一点。 L2S将评估可以在本地进行评估的内容,并仅根据需要由db评估的内容生成SQL查询。例如。 _where(protocolID == 0 || spl.ProtocolId == protocolID)&&(someOtherParam == 0 || spl.SomeOtherColumn == someOtherParam)... etc ... _ – KristoferA 2011-05-12 05:59:09