我正在創建一個報告,根據用戶定義的過濾標準列出數據庫中的人員。因此,例如,我可以通過姓名,年齡等如何爲SQL交叉連接編寫Linq表達式?
var people = db.People.AsQueryable();
if (filterByName)
people = people.Where(p => p.LastName.Contains(nameFilter));
if (filterByAge)
people = people.Where(p => p.Age == age);
現在的過濾標準之一是要表明誰沒有過自己的免疫接種要求的人進行篩選。我有Immunization
和PersonImmunization
(在PersonID, ImmunizationID
上有唯一索引)的表格。如果有人遺漏了任何記錄,或者他們收到的劑量數量低於要求,則應該包括這些記錄,否則應該包括這些記錄。
如果我寫一個SQL查詢,這將是:
select p.*
from Person p
cross join Immunization i
left join PersonImmunization pi
on pi.PersonID = p.ID and pi.ImmunizationID = i.ID
where pi.ID is null or pi.Doses < i.RequiredDoses;
爲了讓我的where子句中的這一部分
現在,我需要這個使用Expression
謂詞來表達:
if (filterByImmunizations) {
Expression<Func<Person, bool>> nonCompliantImmunization =
person => <now what?>;
people = people.Where(nonCompliantImmunization);
}
我遇到的第一個問題是如何將免疫接種到表達式中。然後,一旦我有了它,我懷疑找到不合規的人可能會更直接,但如果你可以在你的答案中包括這一點,我會非常感激!
編輯:我已經被要求解釋爲什麼我如此設置使用Expression<Func<Person, bool>>
獲得解決方案。原因是我已經在幾個不同的上下文中構建了一個用於編寫複雜的用戶定義查詢的整體通用框架。爲了讓您的發動機內部有什麼想法,這裏是我的基類中什麼是一個片段:
public abstract class QueryBuilder<T> where T : EntityObject {
public static IQueryable<T> FilterQuery(IQueryable<T> query, IEnumerable<QueryConditionLite> filters, bool anyConditionSufficient) {
...
}
protected Expression<Func<TBase, bool>> GetPredicate(Expression<Func<TBase, double>> expression, IQueryCondition condition) {
...
}
}
然後,我有一個PersonQueryBuilder : QueryBuilder<Person>
,並在我想創建一個過濾器顯示誰是非的人 - 符合他們的免疫要求。我認爲你會同意查詢語法不會削減它。
@Nilesh - The que爲了防止混淆,我從實際的代碼中刪除了一些內容;請接受,因爲我需要'Expression>,查詢語法不足以滿足我的目的。 –
請編輯您的問題,以添加您禁止有效工作解決方案的理由。 –
爲什麼你覺得你只能查詢一個.Where(...)? – Tory