2013-04-15 25 views
-1

我有Criteria表與列CriteriaID,CriteriaValueID,UserId,companyid。其他表格爲UserMaster,字段爲UserID,UserName,Email。 現在在條件表中,有多個條件的一個用戶有多行。這裏行數是動態的。我正在使用LINQ to Entity。我需要使用criteriavalueid和criteriaid使用和表達式來搜索用戶。LINQ to Entity過濾其他表的多行

E.g. 
companyid UserID UserName 
1   1  ABC 
1   2  BCD 
2   3  CDE 
CriteriaID CriteriaValueID UserId companyid 
1   1    1  1 
2   4    1  1 
3   9    1  1 
1   2    2  1 
2   4    2  1 

當我搜索可以說,我想用戶提供CriteriaID =2CriteriaValueID = 4然後LINQ到實體應返回用戶ID 1,2。 其實它可以是多個像CriteriaID = 2和CriteriaValueID = 4 2. CriteriaID = 3和CriteriaValueID = 5。這裏我有我們需要用戶的標準列表

在此先感謝。

回答

1

你甚至嘗試過什麼嗎?

from c in Criteria 
where c.CriteriaID = 2 && c.CriteriaValueID = 4 
select c.User 

這假設你在實體框架中創建的數據庫和導航屬性上定義了外鍵。

+0

在上述情況下,我提到只有一個條件,但實際上它可以是多個像 1. CriteriaID = 2和CriteriaValueID = 4 2. CriteriaID = 3和CriteriaValueID = 5這裏我的標準的列表爲此我們需要用戶 –

+0

在這種情況下,我不知道在'EF'中是否可行。您可能需要退回到存儲過程來執行此操作。這裏是'MySql'的有用解決方案http://stackoverflow.com/questions/4488472/sql-filtering-by-multiple-columns,我認爲應該可以在'SQL Server'中實現類似的東西。然後將存儲過程映射到'EF'非常簡單 – Pako

0

這是假設你有你的Criteria對象和CompanyUser對象,可能命名爲別的東西。

在這個例子中,我手動添加了Criteria,但是我認爲你會增加Criteria你想要的東西,然後類似Users。看起來CriteriaIDCriteriaValueID是多餘的,如果您只比較UserIDCompanyID,但使用CriteriaID作爲唯一標識符或主鍵。

// Create a list of Criteria 
List<Criteria> ListOfCriteria = new List<Criteria>(); 
// Add Criteria where Criteria ID = 2 and CriteriaValueID = 4 and Criteria ID = 2 
// Adding Criteria objects instead of retrieval for example, you want to retrieve the Criteria object from your existing list 
ListOfCriteria.Add(new Criteria() { CriteriaID = 2, CriteriaValueID = 4, CompanyID = 1, UserID = 1 }); 
ListOfCriteria.Add(new Criteria() { CriteriaID = 1, CriteriaValueID = 1, CompanyID = 1, UserID = 1 }); 
// Create a list of your users 
List<CompanyUser> ListOfUsers = new List<CompanyUser>(); 
// The below is to add users as shown in your example, ideally, you will be pulling your User object from database 
ListOfUsers.Add(new CompanyUser() { CompanyID = 1, UserID = 1, UserName = "ABC" }); 
ListOfUsers.Add(new CompanyUser() { CompanyID = 1, UserID = 2, UserName = "BCD" }); 
ListOfUsers.Add(new CompanyUser() { CompanyID = 2, UserID = 3, UserName = "CDE" }); 
// Retrieve a single user that matches all your requirements 
CompanyUser RetrievedUser = ListOfUsers.Where(a => ListOfCriteria.All(b => b.UserID == a.UserID && b.CompanyID == a.CompanyID)).FirstOrDefault(); 

if(RetrievedUser == null) 
    MessageBox.Show("No user found"); 
else 
    MessageBox.Show(RetrievedUser.UserName);