2016-09-09 2 views
3

У меня есть следующие классы, которые имеют то же переменное, но один из них обнуляемое, другие не потому, что является первичным ключом в этой таблице:же имя переменного в другом классе, но один обнуляемый

[DataServiceKey("OrderID")] 
public class Order 
{ 
    public int OrderID { get; set; } 
    public int? EmployeeID { get; set; } 
    // ...other properties... 
    // ... 

    public Employee Employees { get; set; } 
} 
[DataServiceKey("EmployeeID")] 
public class Employee 
{ 
    public int EmployeeID { get; set; } 
    // ...other properties... 
    // ... 

    public IEnumerable<Order> Orders { get; set; } 
} 

Основная идея между этими 2 классами порядок может принадлежать 1 Работнику, но также может существовать порядок, который не назначен любому сотруднику еще, сотрудник должен иметь по крайней мере 1 порядка или более чем на 1 Теперь я пытаюсь создать связь между классом Order и классом Employee, и вот как я это сделал:

 // Create an association between Orders and Employees 
     var _es = _Employees.ToDictionary(e => e.EmployeeID); 
     var _os = _Orders.ToLookup(o => o.EmployeeID); 
     foreach (var o in _Orders) o.Employees = _es[o.EmployeeID]; 
     foreach (var e in _Employees) e.Orders = _os[e.EmployeeID]; 

Я получил cannot convert from "int?" to "int" ошибку в _es[o.EmployeeID], я перепробовал все решения, предусмотренные в here, но ни один из них не работает для меня ... Я также попытался использовать _es[o.EmployeeID.Value], он действительно решает ошибку, но на этот раз это gaves me System.InvalidOperationException Ошибка при запуске. Есть ли какие-либо возможные решения для моей проблемы?

+2

вы можете попробовать, как этот 'Еогеасп (вар о в _Orders) o.Employees = _es [o.EmployeeID] ?? Default (int); ' – Webruster

ответ

3

Вы пропускание int? для ключа к словарю, где int необходимо.

o.Employee является int?.

es является Dictionary<int, Employee>.

Вы, вероятно, хотите:

o.Employees = o.EmployeeID != null ? _es[o.EmployeeID] : null; 
+0

Вместо проверки' null', проверьте, имеет ли значение значение с помощью 'HasValue' –

+0

@BalagurunathanMarimuthu, проверяющий значение' null', является самым идиоматическим для C#. Это синтаксический сахар для 'HasValue' - два идентичны. –

+0

Да, я согласен, но переменная 'Nullable' содержит предопределенное свойство, чтобы проверить, имеет ли значение значение или null. –

1

Перед тем, как назначить значение, отметьте HasValue.

foreach (var o in _Orders) 
{ 
    if (_es[o.EmployeeID].HasValue) 
    { 
     o.Employees = _es[o.EmployeeID]; 
    } 
} 

или

foreach (var o in _Orders) o.Employees = _es[o.EmployeeID].HasValue ? _es[o.EmployeeID] : null; 
Смежные вопросы