2017-05-03 11 views
0

你好傢伙即時通過這個查詢做一個lamba表達式,我有一種卡住我不得不做一些簡單的lambda表達式之前,現在我需要做一個多重條件混合或和在這一個和有點新的這個。如何將這樣的多個條件轉換爲lambda

所以讓我解釋一下這個結構,你會看到爲什麼很棘手(至少對lambda的新手來說)。我有請求,其中請求具有許多屬性,屬性具有名稱和值,因爲根據請求狀態它們具有不同的屬性,在這種情況下,「RequestState.APPROVAL_PENDING」是一個常量,它會使正確的狀態和屬性名稱也與具有我需要的屬性名稱的常量以及需要查找的值在屬性值中是wwid。

然後我會做一個query.tolist();並獲得所有請求。但我需要找出如何lambda這個。我有點卡住了。我會在這裏申請任何幫助和/或竅門。

var query = from request in DBContext.REQUESTs 
         join attr in DBContext.REQUEST_ATTRIBUTES on request.REQUEST_ID equals attr.REQUEST_ID 
         where (attr.ATTRIBUTE_VALUE == wwid && 
         (attr.ATTRIBUTE_NAME == RequestAttributes.APPROVER_2_WWID || attr.ATTRIBUTE_NAME == RequestAttributes.APPROVER_WWID)) 
         && request.STATE_ID == RequestState.APPROVAL_PENDING 
         select request; 

感謝

+0

你見過[這](http://stackoverflow.com/questions/13692015/how-to-rewrite-this-linq-using-join-with-lambda-expressions) ?你有什麼更可讀。 – Jasen

+0

@ daniel-vega。我的答案是否適合你? – Boney

回答

0
var query = DBContext.REQUESTs.Where(request => request.STATE_ID == RequestState.APPROVAL_PENDING) 
         .Join(DBContext.REQUEST_ATTRIBUTES.Where(attr => attr.ATTRIBUTE_VALUE == wwid && 
           (attr.ATTRIBUTE_NAME == RequestAttributes.APPROVER_2_WWID || attr.ATTRIBUTE_NAME == RequestAttributes.APPROVER_WWID)), 
          request => request.REQUEST_ID, 
          attr => attr.REQUEST_ID, 
          (request, attr) => request); 
0

這裏是這樣做的另一種方式。

創建一個從請求導航屬性RequestAttributes:

public class Request 
{ 
    .... Properties... 
    public virtual ICollection<RequestAttribute> RequestAttributes { get; set; } 
} 
public class RequestAttribute 
{ 
    .... Properties... 
    public virtual Request> Request { get; set; } 
} 

這將創建一個從請求RequestAttributes一對多的關係。和您的查詢就會變成:

var query = DBContext.REQUESTs.Where(r=> r.REQUEST_ATTRIBUTES.Any(attr=>attr.ATTRIBUTE_VALUE == wwid && 
        (attr.ATTRIBUTE_NAME == RequestAttributes.APPROVER_2_WWID || attr.ATTRIBUTE_NAME == RequestAttributes.APPROVER_WWID)) 
        && r.STATE_ID == RequestState.APPROVAL_PENDING) 
        .Select(r=> r);